Как построить спектр, используя FFTW3/ QWT?

Я хочу построить частотный спектр (как, например, в Audacity). Поэтому я хочу, чтобы частота в герцах на оси х и амплитуда на оси у. Мой вход - периодически синусоида с амплитудой 0,7 и частотой 500 Гц. Я использую FFTW для вычисления величины и QWT для построения графика. Моя проблема, какие параметры я должен поместить в setSamples, чтобы получить картинку на 500 Гц? Любая помощь будет оценена здесь мой код

1 ответ

Решение

Из документации вы должны установить два указателя на данные, которые строят кривую и размер (количество образцов в вашем случае).

void QwtPlotCurve::setSamples(const double *xData, const double *yData, int size)

В вашем случае yData - это данные из FFT, xData - это массив, который перемещается от минимальных до максимальных /2 значений частоты FFT, отбрасывая другую половину, когда сигнал является реальным сигналом:

curve->setSamples(signalx, magnitude, N/2);

это должно работать, если я прав.

РЕДАКТИРОВАТЬ

Изменить также:

signalx[i]=i;
magnitude[i]=sqrt(reout[i]*reout[i] + imgout[i]*imgout[i]); //calculate magnitude 

чтобы:

signalx[i]=(double)(Fs * i) / (double)N;
magnitude[i]=sqrt(reout[i]*reout[i] + imgout[i]*imgout[i]) / ((double)N / 2.0);

представлять частоту для элемента величины [i] на графике.

Вы должны также проверить частоту Найквиста. Сэмплирование синусоидальной волны 500 Гц при 1000 Гц приводит к появлению алиасинга, и если вы отобразите данные своего сигнала [] (с дискретными шагами), вы сможете увидеть их.

Другие вопросы по тегам