Преобразование 32-битной формы волны в 16-битную форму волны - PullRequest
2 голосов
/ 29 сентября 2010

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 29 сентября 2010

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

2 голосов
/ 29 сентября 2010

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

http://sox.sourceforge.net/

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

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

sox any-file -b 16 частота передачи -I 22050 дизеринг -s

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

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

1 голос
/ 29 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...