Важная информация

User Tag List

Показано с 1 по 10 из 10

Тема: Конвертация аудио беззнаковое в знаковое. Как?

  1. #1
    Activist
    Регистрация
    27.11.2015
    Адрес
    г. Самара
    Сообщений
    341
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Конвертация аудио беззнаковое в знаковое. Как?

    Пре-амбула:
    Делаю новую FPGA платформу для эмуляции разных ретро систем. Свой ZX эмулятор, по традиции, использую в качестве пробного шара. Дошел до аудио где требуется представление ввиде знаковых сэмплов (signed samples) - I2S.

    Амбула:
    Вроде, согласно общему представлению о конвертации достаточно проинвертировать старший бит чтобы 0..65535 сместить в диапазон -32767..+32767... Но я тут поразмыслил - нельзя так делать, как мне кажется..
    Ведь в беззнаковом представлении амплитуда это полный диапазон 0-65536, когда как в знаковом амплитуда вроде как 0-32767.. Можно возразить, что амплитуда всё же -32767..+32767 и вроде равна той что в беззнаковом представлении, однако мне кажется что они не равны..
    В добавок при инвертировании старшего бита у меня явный перегруз слышен на I2S, когда как в беззнаковом виде при использовании Delta-Sigma ЦАП перегруза нет.
    В добавок к этому, уровень "тишины" после такой конвертации -32768, что не есть хорошо.

    Есть ли проверенный метод перевода беззнаковых сэмплов в знаковые?

    - - - Updated - - -

    Чисто "проигав" знаковй сэмпл в уме, прихожу к выводу что нужна более продвинутая конвертация по типу конденсатора, где спокойствие стремится к нулю а любое возмущение с последующим обратным возмущением рождает отрицательную полуволну...
    Последний раз редактировалось Saar; 21.04.2017 в 13:39.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,550
    Спасибо Благодарностей отдано 
    1,213
    Спасибо Благодарностей получено 
    1,748
    Поблагодарили
    680 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Конвертация из беззнакового формата в знаковый - это чисто инверсия старшего бита. Только так и никак более)

  4. #3
    Activist
    Регистрация
    27.11.2015
    Адрес
    г. Самара
    Сообщений
    341
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Звук искаженный идет если просто инвертировать старший бит.
    И остается нерешенным вопрос по поводу уровня тишины. При инверсии старшего бита он на -32767 что находится на максимуме амплитуды. Отсюда сильные щелчки при инициализации и перезагрузке FPGA.

  5. #4
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    656
    Поблагодарили
    511 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию


    Цитата Сообщение от Titus Посмотреть сообщение
    Конвертация из беззнакового формата в знаковый - это чисто инверсия старшего бита. Только так и никак более)
    о чем это вы ? о_О

    2 - 0000 0000 0000 0010
    -2 - 1111 1111 1111 1110

    чтоб сконвертировать в знаковое нужно сделать -32768±1


    чтоб из знакового обратно нужно +32768±1


    чтобы сменить знак на противоположный нужно инверсировать биты числа (заменить 0 на 1 и 1 на 0) и +1 (если мы кудато спешим можно и не плюсовать)


    простая инверсия бита знака даст страшные искажения
    да и инверсия бита знака не даст никакого перевода даже если мы будем хранить числа в формате в котором будет бит знака и смещение от 0 в обыкновенном виде...
    и для чисел с плавающей запятой это тоже не прокатит...

    Последний раз редактировалось NEO SPECTRUMAN; 21.04.2017 в 23:49.

  6. #5
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    656
    Поблагодарили
    511 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Проверил
    16 бит WAV хранит значение со знаком в таком же виде



    Цитата Сообщение от Saar Посмотреть сообщение
    -32767..+32767
    -32768
    +32767
    как бы

    $7FFF маскимум + по версии audacity
    $8000 максимум -

    самое интересное что audacity
    проэкспортировал звук с подмешиванием высокочастотного писка килогерца 22
    в итоге в файле уровень 0 колебался в диапазоне ±4
    хотя до экспорта была тишина

    то же и с максимальным и минимальным уровнем...
    Последний раз редактировалось NEO SPECTRUMAN; 21.04.2017 в 23:50.

  7. #6
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,550
    Спасибо Благодарностей отдано 
    1,213
    Спасибо Благодарностей получено 
    1,748
    Поблагодарили
    680 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    о чем это вы ? о_О

    2 - 0000 0000 0000 0010
    -2 - 1111 1111 1111 1110
    При чем здесь СМЕНА знака и конвертация из беззнакового диапазона в знаковый? Это совершенно разные вещи)
    Конвертация из беззнакового формата - это всего лишь смещение на половину диапазона. Т.е. инверсия старшего бита. Или говоря математичнее прибавление или уменьшение числа на 0x8000.
    Таким образом самое малое число 0x0000 станет -0x8000, средне 0x8000 станет 0x0000, а самое большое 0xFFFF станет 0x7FFF.

  8. #7
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    656
    Поблагодарили
    511 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    При чем здесь
    Интересно...
    ...картина мира перевернулась...

    я делал подобное и получал тот же эффекта с искажением...
    из чего сделал вывод что...

    а если взять калькулятор то все правильно получается... о_О

    интересно где же была ошибко...
    Последний раз редактировалось NEO SPECTRUMAN; 21.04.2017 в 23:59.

  9. #8
    Junior
    Регистрация
    01.05.2017
    Адрес
    д. Маасдижк, Нидерланды
    Сообщений
    14
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В знаковом представлении, уровень тишины - это ноль. В принципе, если вычесть 0х8000, то все работает, но есть нюанс: к примеру, в ZXSpin при отсутствии звука, раздаются потрескивания - это он -0х8000 постоянно в звуковушку кидает, что не есть правильно и хорошо.

    А Аудасити, скорее всего, просто добавил дизеринга при конверсии (не проверял, предположение).

  10. #9
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,053
    Спасибо Благодарностей отдано 
    218
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Saar Посмотреть сообщение
    В добавок к этому, уровень "тишины" после такой конвертации -32768, что не есть хорошо.
    А кто вам сказал, что в беззнаковом представлении уровень "тишины" должен быть 0? Нет, он должен быть 32768, что при переводе в беззнаковое представление превращается в нуль.

    Здесь логика проста. Уровень "тишины" должен быть посередине между минимальным и максимальным уровнем сигнала для того, чтобы биполярный сигнал (т.е. фактически любой сигнал без постоянной составляющей) не привел к "перегрузу".
    Цитата Сообщение от Saar Посмотреть сообщение
    Есть ли проверенный метод перевода беззнаковых сэмплов в знаковые?
    Описанная инверсия старшего бита, как правильно заметил выше Titus, и есть такой проверенный метод, единственно верный.
    Цитата Сообщение от Saar Посмотреть сообщение
    Чисто "проигав" знаковй сэмпл в уме, прихожу к выводу что нужна более продвинутая конвертация по типу конденсатора, где спокойствие стремится к нулю а любое возмущение с последующим обратным возмущением рождает отрицательную полуволну...
    "По типу конденсатора" - это фильтр высоких частот. Можно сделать такой фильтр простейшей формулой вида:
    y[n] = -a*y[n-1] + x[n] - x[n-1]
    где x[n] - входной сигнал, y[n] - выходной сигнал (текущий отсчет), y[n-1] - предыдущий отсчет выходного сигнала, x[n-1] - предыдущий отсчет входного сигнала; a - константа, 0<a<1. От этой константы зависит частота среза по низким частотам. Формула АФЧХ: H = (1-z^-1)/(1+a*z^-1), для АЧХ надо взять модуль от H и перевести его в децибелы; z=exp(-j*w*T), где j^2=-1, w=2*pi*f, f - частота, T - период дискретизации, в секундах; pi=3.14...

    Однако хочу предостеречь от использования фильтров без необходимости. Для перевода из беззнакового в знаковый формат никакие фильтры не нужны. Фильтр же приводит к фазовым искажениям и (в некоторой степени) искажениям АЧХ, а также потребляет вычислительные ресурсы. В случае целочисленной реализации фильтр добавляет шум.

  11. #10
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Адрес
    Харьков
    Сообщений
    1,404
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    18
    Поблагодарили
    12 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Saar Посмотреть сообщение
    Отсюда сильные щелчки при инициализации и перезагрузке FPGA.
    это можно решить, добавив ВЧ FIR фильтр. Для FPGA в квартусе вроде есть визард для создания FIR фильтров.
    Частоту среза можно выбрать с небольшим запасом от минимально воспроизводимой.
    Т.е. если принять за минимальную частоту 20 Гц, то можно расчитать HPF FIR фильтр на 10 Гц.
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Аудио-программы для УКНЦ
    от Gryphon в разделе ДВК, УКНЦ
    Ответов: 93
    Последнее: 24.07.2021, 21:32
  2. Конвертация образов
    от TeemonIvanov в разделе Для начинающих
    Ответов: 13
    Последнее: 17.05.2010, 11:14
  3. переключатель видео\аудио сигнала
    от vano в разделе Несортированное железо
    Ответов: 1
    Последнее: 06.05.2009, 07:42
  4. конвертация и эмуляция
    от jimon в разделе Эмуляторы
    Ответов: 12
    Последнее: 25.02.2006, 21:19

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •