Как построить спектр, используя 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 Гц приводит к появлению алиасинга, и если вы отобразите данные своего сигнала [] (с дискретными шагами), вы сможете увидеть их.