Преобразование 32-битной формы волны в 16-битную форму волны

Я захватывал звук, используя режим захвата шлейфа. Захваченный сигнал является 32-битным сигналом. Я изо всех сил пытаюсь преобразовать это в 16-битную форму сигнала, чтобы кодеры вроде lame могли справиться с этим (он говорит, что формат неподдерживаемых данных: 0x0003).

Я пытался переместить биты (не моя сильная сторона) в самом волновом потоке с 32 бит на 16 бит, но результат все еще звучит искаженным.

Класс Wave32To16Stream в этом случае кажется взорванным: if (sourceStream.WaveFormat.Encoding! = WaveFormatEncoding.IeeeFloat) генерирует новое ApplicationException («Поддерживается только 32-битная плавающая точка»);

В идеале я хотел бы просто записать прямо в 16 бит, разве нет способа установить битовую глубину захвата? Если нет, может ли кто-нибудь помочь мне с преобразованием волнового потока?

Пример захваченного сигнала можно найти здесь:http://dl.dropbox.com/u/454409/test.wav (10mb)

Я также согласился бы на какой-то способ кодирования этого файла в mp3 с помощью lame, я пробовал каждую перестановку параметров, которую только мог придумать, чтобы заставить ее принять файл волны. Что интересно, Audacity (который использует lame_enc для кодирования mp3s) смог создать mp3 из сигнала (но, возможно, Audacity автоматически преобразует его в 16 бит, прежде чем передать его в lame).

Ответы на вопрос(3)

Сокс может преобразовать это для вас.

http://sox.sourceforge.net/

Подходящие командные строки:

http://sox.sourceforge.net/Docs/FAQ

sox any-file -b 16 частота выходных файлов -I 22050 дизеринг -s

Нотабене И повторная выборка, и сглаживание требуют некоторого запаса. Если SoX сообщает, что во время обработки произошло какое-либо ограничение, то преобразование следует повторить с некоторым ослаблением, например,

sox any-file -b 16 усиление выходного файла -1 коэффициент 44100 дизеринга -s

 Andrew Rondeau25 окт. 2016 г., 03:42
В правильной конвертации в 16 бит есть немного магии. Ошибка округления слышна при воспроизведении на объемах. У Sox довольно умные формирователи шума, которые могут сделать ошибку округления неслышимой, скрывая ее в местах, которые не слышны.
Решение Вопроса

Формат 0x0003 на самом деле ieeeFloat, вы не должны получать это исключение. Лучше проверьте значение, которое он прочитал. Вы не можете конвертировать значения с битовым смещением, вы должны конвертировать из float в short. Простой актерский состав выполняет свою работу.

 hreinn100030 сент. 2010 г., 11:05
Это указало мне правильное направление, исправило мою проблему.

Если ваш 32-битный формат является плавающим, то, скорее всего, значения выборки находятся в диапазоне от -1 до 1. Чтобы преобразовать в 16-битные (целые), вам нужно умножить на 32767 и привести к INT16.

Если 32-битный диапазон с плавающей запятой больше -1..1, вам необходимо найти минимальные и максимальные значения и рассчитать масштабный коэффициент, который получает выборки в диапазоне INT16.

Возможно, вам придется добавить немного дизеринга.

Ваш ответ на вопрос