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

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

Опитах се да преместя битовете (не е моята силна страна) в самия вълнов поток от 32 бита на 16 бита, но резултатът все още звучи изкривен.

Класът Wave32To16Stream изглежда се взривява в този случай: if (sourceStream.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat) throw new ApplicationException("Поддържа се само 32 бита с плаваща запетая");

В идеалния случай бих искал просто да заснема направо до 16 бита, няма ли начин да задам битовата дълбочина на улавяне? Ако не, може ли някой да ми помогне с преобразуването на вълновия поток?

Пример за уловена форма на вълната може да се намери тук: http://dl.dropbox.com/u/454409/test.wav (10mb)

Бих се задоволил и с някакъв начин да кодирам това в mp3 с lame, опитах всяка пермутация на параметър, за която мога да се сетя, за да го накарам да приеме файла с вълна. Интересното е, че Audacity (който използва lame_enc за кодиране на mp3) успя да създаде mp3 от формата на вълната (но може би Audacity автоматично го преобразува в 16-битов, преди да го прехвърли на lame).


person hreinn1000    schedule 29.09.2010    source източник


Отговори (3)


Форматът 0x0003 всъщност е ieeeFloat, не трябва да получавате това изключение. По-добре проверете стойността, която е прочела. Не можете да преобразувате стойностите с битово изместване, трябва да преобразувате от float към short. Една проста отливка върши работата.

person Hans Passant    schedule 29.09.2010

Sox може да конвертира това вместо вас.

http://sox.sourceforge.net/

Подходящи командни редове:

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

sox произволен файл -b 16 outfile rate -I 22050 dither -s

N.B. И повторното семплиране, и дитърингът изискват известно пространство. Ако SoX съобщи, че е настъпило изрязване по време на обработката, тогава преобразуването трябва да се направи отново с известно затихване, напр.

sox произволен файл -b 16 усилване на изходящ файл -1 скорост 44100 дитър -s

person strainer    schedule 29.09.2010
comment
Има малко магия, свързана с правилното преобразуване в 16 бита. Грешката при закръгляване се чува, когато се възпроизвежда при сила на звука. Sox има доста интелигентни устройства за формиране на шум, които са в състояние да направят грешката на закръглянето нечуваема, като я скриват на места, които не се чуват. - person Andrew Rondeau; 25.10.2016

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

Ако 32-битовият float диапазон е по-голям от -1..1, тогава трябва да намерите минималните и максималните стойности и да изчислите коефициент на мащабиране, който поставя пробите в диапазона INT16.

Може да се наложи да добавите малко трептене.

person Han    schedule 29.09.2010