Алгоритм БПФ — как преобразовать образцы в сложные структуры?

Краткая версия моего вопроса:

Как перейти от массива аудиосэмплов (как Int16) к сложным структурам, используемым общими библиотеками FFT, такими как AForge?

Длинная версия моего вопроса:

Я новичок в обработке звука и хочу анализировать звук в музыке (обнаружение битов, темпа и т. д.). После нескольких дней чтения этого алгоритм быстрого преобразования Фурье (БПФ) кажется шагом в правильном направлении.

Чтобы приступить к работе и не реализовывать алгоритмы с нуля, я скачал пару библиотек с открытым исходным кодом, Exocortex и AForge.net.

Я декодирую звук в буфер памяти. В каждом цикле для моей 16-битной звуковой стереодорожки 48 кГц я получаю 48000 байт или 24000 сэмплов. В настоящее время они копируются в массив коротких (Int16). Теперь мне нужно преобразовать мой массив в сложные структуры (в случае AForge). Это, в свою очередь, инициализируется "реальным" и "воображаемым" двойным значением. Но что это такое и как мне перейти от моего массива к этим двум двойным значениям? Кроме того, нужно ли разделять левый/правый канал перед передачей?

К сожалению, я ужасно не умею читать математические формулы, если они не представлены в виде кода. Почти на всех сайтах, которые я до сих пор посещал, быстро появляются греческие символы и сложные математические формулы, помогающие объяснить алгоритм. В результате я сразу теряюсь в переводе. Поверьте, я очень старался найти "алгоритмы БПФ для чайников". ;)

Примечание для модераторов. Это не дубликат Convert Audio Samples. из байтов в комплексные числа? хотя вопрос похож.


person BlueVoodoo    schedule 01.08.2012    source источник


Ответы (1)


Вам нужно либо разделить каналы и обработать их отдельно, либо усреднить их до одного моноканала — что лучше всего зависит от того, чего вы в конечном итоге пытаетесь достичь.

Что касается преобразования типов данных - каждое действительное число также является комплексным числом, у которого есть «мнимая» часть 0, поэтому преобразование, по сути, заключается в создании массива комплексных чисел с выборкой (предпочтительно нормализовано - в этом случае разделить на 32768, поэтому у вас есть значения в диапазоне [-1,+1]) в действительной части и ноль в мнимой части.

person twalberg    schedule 01.08.2012
comment
Спасибо за Ваш ответ. Попробую это. Из любопытства, почему я должен установить мнимое число в 0. Что это такое и почему оно там? - person BlueVoodoo; 01.08.2012
comment
Для этого пришлось бы углубляться во все те формулы, в которые, как вы сказали, вы бы предпочли не вникать - сложная математика - довольно важный и сложный предмет, для которого здесь недостаточно места, чтобы даже начать его объяснять. Если вы действительно хотите знать, найдите учебник или что-нибудь по сложной математике; в текущем контексте, однако, я думаю, что это лучший ответ - если вы использовали что-то кроме 0, вы получили бы неправильные ответы. - person twalberg; 01.08.2012
comment
Справедливо. Кажется, теперь это работает, поэтому я приму это как ответ. - person BlueVoodoo; 01.08.2012
comment
Обратите внимание, что некоторые библиотеки БПФ также предлагают преобразование действительного в комплексное БПФ, которое несколько более эффективно, чем использование комплексного в комплексное БПФ, когда все мнимые части входных данных равны 0. Это требует чисто действительных входных данных, но вы все равно получить сложные выходные данные в частотной области, конечно. - person Paul R; 01.08.2012