2010-09-29 3 views
2

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

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

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

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

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

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

ответ

3

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

+0

Это указывало мне в правильном направлении, исправила мою проблему. – hreinn1000

2

Sox может конвертировать это для вас.

http://sox.sourceforge.net/

Подходящие commandlines:

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

SOx любой файл--b 16 выходной_файл скорости -I 22050 дитеринга -s

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

Сокс любого файла--b прирост 16 Outfile -1 скорости 44100 дитеринга -s

+0

Есть немного магии, связанной с преобразованием в 16 бит правильно. Ошибка округления слышима при воспроизведении на томах.У Sox есть довольно интеллектуальные шумоподавители, которые могут сделать ошибку округления неразборчивой, скрывая ее в местах, которые не слышны. –

1

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

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

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