#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; в противном случае неправильно представлена