Как построить спектр с помощью FFTW3 / QWT?

#c #plot #fft #fftw #qwt

#c #построить #бпф #fftw #qwt

Вопрос:

Я хочу построить частотный спектр (как, например, в Audacity). Следовательно, мне нужна частота в Герцах по оси x и амплитуда по оси y. Мой ввод представляет собой периодически возникающую синусоидальную волну с амплитудой 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);
 

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

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

Комментарии:

1. Спасибо, Марко, мой график по-прежнему пуст, несмотря на изменение кода f

2. Я обновил ответ, надеясь, что на этот раз он работает правильно. Если нет, эта ссылка может быть полезной. Извините, но я не могу протестировать библиотеки Qwt / ffw3.

3. когда я устанавливаю частоту дискретизации Fs = 8000 Гц и f = 1000 Гц, на графике пик равен 2000 Гц, когда f = 500 Гц, на графике пик равен 1000 Гц. У меня создается впечатление, что изображение на графике принимает двойную входную частоту

4. Вы правы, я вижу свой старый код C FFT, который вычисляет только первую половину (реальный сигнал). Ответ обновлен. Вопрос: ваша амплитуда представлена правильно?

5. Амплитуда правильно представлена для величины [i]= sqrt(reout[i] * reout[i] imgout[i] * imgout[i]) / (double)N / 2; в противном случае неправильно представлена