如何使用FFTW3 / QWT绘制光谱?

时间:2014-06-22 17:27:15

标签: c++ plot fft fftw qwt

我想绘制频谱(就像他们在Audacity中所做的那样)。因此,我想要在x轴上的赫兹频率和在y轴上的幅度。 我的输入是一个周期性的正弦波,振幅为0.7,频率为500HZ。我使用FFTW计算幅度和QWT。 我的问题是,我应该在setSamples中放入什么参数来获得500 HZ的图片? 任何帮助,将不胜感激 这是我的代码

1 个答案:

答案 0 :(得分:0)

documentation开始,您必须设置两个指向构建曲线和大小的数据的指针(在您的情况下为样本数)。

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

在你的情况下,yData是来自FFT的数据,xData是一个数组,它扫描FFT的最小值/最大值/ 2个频率值,当信号是真实信号时丢弃另一半:

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]元素的频率。

您还应该检查nyquist frequency。以1000Hz采样500Hz正弦波会产生混叠,如果您绘制信号[]数据(在不连续的步骤中),您可以看到它。