2016-02-29 4 views
2

Я хочу проанализировать сигнал, который я получаю из своего порта микрофона, используя portaudio и fftwpp. Для этого я следовал приведенному объяснению here. Мои вопросы по этому вопросу сейчас:
Там сказано, что я должен вырезать окно из входящих данных. Мои данные уже разбиты, после того, как я записываю только на короткое время, а затем обрабатываю их. Таким образом, я предполагаю, что прямоугольное окно уже применяется к моим данным. Это верно?
Теперь я получаю 200k точек данных, я должен непосредственно поместить их в массив:Дальнейшее понимание fftw обработки сигналов portaudio

Array::array1<Complex> F(np,align); 
    Array::array1<double> f(n,align);    // For out-of-place transforms 
    // array1<double> f(2*np,(double *) F()); // For in-place transforms 

    fftwpp::rcfft1d Forward(n,f,F); 
    fftwpp::crfft1d Backward(n,F,f); 
    qDebug() << "Putting " << numSamples << " into an array!"; 
    for(int i = 0; i < numSamples; i++) 
     f[i] = this->data.recordedSamples[i]; 

или я должен разделить их? Если я все помещу их в один массив, какое разрешение я получу тогда? Моя частота выборки установлена ​​равной 44,1 кГц.

ответ

1

Таким образом, я предполагаю, что прямоугольные окна уже применяются к моим данным. Это верно?

В некотором смысле, окно обычно используется, чтобы отфильтровать большие искажения частоты из-за внезапного включения/выключения состояния сигнала или уменьшить или изменить порядок утечек спектра (https://en.wikipedia.org/wiki/Spectral_leakage)

Рекомендуется примените окно, особенно (не прямоугольное), если вы хотите визуализировать fft. См. https://en.wikipedia.org/wiki/Window_function#Hann_.28Hanning.29_window для параметров.

Имейте в виду, что вы применили окно до fft.

или я должен разделить их?

Ну, это зависит от ваших требований. Но в целом, чем лучше, из-за окна, тем дольше образец, тем точнее FFT за этот период времени, хотя такие методы нередко ускоряют работу.

какое разрешение я получаю тогда?

Разрешение - это частота дискретизации, деленная на количество отсчетов.

+0

Должен ли я применить окно в каждом случае, даже если я не хочу, чтобы визуализировать данные? –

+0

Ну, это зависит от приложения. Основная причина применения окна - уменьшить (или переместить) спектральную утечку (см. Https://en.wikipedia.org/wiki/Spectral_leakage). Это полностью зависит от приложения, если это необходимо. Говорят, если вы хотите визуализировать спектр, он не нужен. Если вам нужно проверить существование 1 частотной составляющей, это сделает прямоугольное окно. Не применяя ни одного окна, вы получаете практически те же результаты (при условии соблюдения правила 2^n-fft). – Stefan

+0

Альтернативный подход упоминается здесь: http://stackoverflow.com/questions/4082358/improving-frequency-resolution-of-fft-output-by-limiting-frequency-range/4082676 – Stefan

4

Если предположить, что данные не стационарным (другими словами, спектральное содержание изменяющихся во времени, как это было бы в случае, например, речь или музыка), то, как правило, хотят, чтобы выбрать размер окна, в течение которого данные можно считать несколько стационарными. Для речи и музыки типичный размер окна может составлять порядка 20 мс. Для частоты дискретизации 44,1 кГц это соответствует 882 выборкам, поэтому хорошей отправной точкой может быть FFT-размер 1024.

Это также распространено для перекрытия последовательных окон, чтобы получить лучшее временное разрешение для изменяющихся во времени компонентов вашего сигнала. Обычно используется 50% перекрытие, поэтому ваш первый блок образцов будет равен 0..1023, второй блок будет равен 512..1535 и т. Д.

Как уже было сказано в ответе @ Стефана, вы должны применить подходящую оконную функцию для каждого блока образцов до БПФ. Обычно используемыми окнами являются Хэмминг и фон Ханн (он же Ханнинг). Очевидно, что функция окна должна быть того же размера, что и FFT (например, N = 1024).

Для любого оставшегося блока образцов размером < N в конце ваших данных вы можете просто набивать нулями.

Обычно используемый термин для вышеуказанной операции генерирует spectrogram. Это, по существу, трехмерная структура данных времени v частота v величина/фаза, которая может отображаться различными способами или использоваться для дальнейшей обработки в частотной области.

Смотрите также эти тесно связанные вопросы StackOverflow и ответы:

+0

Если мое окно меньше 20 мс, я режу все ниже определенной частоты. Это верно? –

+0

Ум, нет - вы не «разрезаете» что-либо - главное, что размер окна определяет разрешение по частоте. Более длинное окно позволяет вам иметь более высокое разрешение по частоте за счет более низкого разрешения по времени - это всегда компромисс. –