Преобразование звуковых выборок из временной области в частотную
как инженер-программист я сталкиваюсь с некоторыми трудностями при работе над проблемой обработки сигналов. У меня нет большого опыта в этой области.
что я пытаюсь сделать, это попробовать звук окружающей среды с частотой дискретизации 44100 и для окон фиксированного размера, чтобы проверить, существует ли определенная частота (20 кГц) и выше порогового значения.
вот что я делаю в соответствии с идеальным ответом в как извлечь информацию о частоте проб от PortAudio с использованием FFTW в C
102400 образцов (госпожа 2320) собраны от тональнозвукового порта с частотой дискретизации 44100. Образец значения между 0.0 и 1.0
int samplingRate = 44100;
int numberOfSamples = 102400;
float samples[numberOfSamples] = ListenMic_Function(numberOfSamples,samplingRate);
размер окна или размер БПФ 1024 образца (23.2 МС)
int N = 1024;
количество окон-100
int noOfWindows = numberOfSamples / N;
образцы разделения на noOfWindows (100) Windows каждый размером Н (1024) образцы
float windowSamplesIn[noOfWindows][N];
for i:= 0 to noOfWindows -1
windowSamplesIn[i] = subarray(samples,i*N,(i+1)*N);
endfor
применение функции окна Ханнинга на каждом окне
float windowSamplesOut[noOfWindows][N];
for i:= 0 to noOfWindows -1
windowSamplesOut[i] = HanningWindow_Function(windowSamplesIn[i]);
endfor
применение FFT на каждом окне (реальное сложное преобразование, выполненное внутри функции FFT)
float frequencyData[noOfWindows][samplingRate/2];
for i:= 0 to noOfWindows -1
frequencyData[i] = RealToComplex_FFT_Function(windowSamplesOut[i], samplingRate);
endfor
на последнем шаге я использую функцию FFT, реализованную в этой ссылке:http://www.codeproject.com/Articles/9388/How-to-implement-the-FFT-algorithm; потому что я не могу реализовать функцию FFT из царапать.
то, что я не могу быть уверен, при предоставлении N (1024) образцов функции FFT в качестве входных, значения децибел samplingRate/2 (22050) возвращаются как выходные. Это то, что делает функция FFT?
Я понимаю, что из-за частоты Найквиста я могу обнаружить половину частоты дискретизации не более. Но можно ли получить значения децибел для каждой частоты до частоты дискретизации/2 (22050) Гц?
спасибо, Вахит!--7-->
2 ответов
см. Как получить частоты каждого значения в БПФ?
от входного сигнала образца 1024, вы можете получить назад 512 содержательных частот-уровней.
Итак, да, в вашем окне вы получите уровень для частоты Найквиста.
самый низкий уровень частоты вы увидите для DC (0 Hz), и следующий вверх будет для SampleRate / 1024, или вокруг 44 Hz, следующего для 2 * SampleRate / 1024, и так далее, до 512 * SampleRate / 1024 Герц.
поскольку в вашем БПФ используется только одна полоса, я ожидал бы, что ваши результаты будут потускнены побочными эффектами, даже с правильным окном. Это может сработать, но вы также можете получить ложные срабатывания с некоторыми входными частотами. Кроме того, ваш сигнал находится недалеко от вашего Найквиста, поэтому берут довольно хорошие пути сигнала до вашего БПФ. Я не думаю, что это правильный подход.
Я думаю, что лучший подход к такому обнаружению сигнала будет с фильтром высокого порядка (в зависимости по вашим требованиям я бы предположил четвертый или пятый порядок, который на самом деле не так высок). Если вы не знаете, как создать фильтр высокого порядка, вы можете использовать два или три фильтра второго порядка последовательно. Здесь описывается проектирование фильтра второго порядка, иногда называемого "biquad":
http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
хотя и очень кратко и с некоторыми предположениями о предварительных знаниях. Я бы использовал фильтр высоких частот (HP) с угловая частота как можно ниже, вероятно, между 18 и 20 кГц. Имейте в виду, что есть некоторое затухание на угловой частоте, поэтому после применения фильтра несколько раз вы упадете немного сигнала.
после фильтрации звука возьмите RMS или среднюю амплитуду (то есть среднее абсолютное значение), чтобы найти средний уровень за период времени.
этот метод имеет несколько преимуществ по сравнению с тем, что вы делаете сейчас, включая лучшую задержку (вы может начать обнаруживать в пределах нескольких образцов), лучшую надежность (вы не получите ложноположительные сигналы в ответ на громкие сигналы на паразитных частотах) и так далее.
этот пост может иметь отношение:http://blog.bjornroche.com/2012/08/why-eq-is-done-in-time-domain.html