【问题标题】:How to plot spectrum using FFTW3/ QWT?如何使用 FFTW3/QWT 绘制频谱?
【发布时间】:2014-06-22 17:27:15
【问题描述】:

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

【问题讨论】:

    标签: c++ plot fft fftw qwt


    【解决方案1】:

    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 正弦波会产生混叠,如果您绘制 signal[] 数据(以离散步骤),您可以看到它。

    【讨论】:

    • 感谢 Marco,尽管更改了 f 代码,但我的图表仍然是空的
    • 我已经更新了答案,希望这次它可以正常工作。如果不是this link 可能会有用。抱歉,我无法测试 Qwt/ffw3 库。
    • 当我设置采样率 Fs=8000 Hz 和 f=1000Hz 时,图中 pic 为 2000Hz,当 f=500Hz 时,图上 pic 为 1000Hz。我在图表上的印象图片是输入频率的两倍
    • 你说得对,我看到我的旧 C FFT 代码只计算前半部分(真实信号)。答案已更新。一个问题:您的幅度是否正确表示?
    • 幅度正确表示为幅度[i]=sqrt(reout[i]*reout[i] + imgout[i]*imgout[i]) / (double)N/2;否则无法正确表示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2017-08-23
    • 2013-03-12
    相关资源
    最近更新 更多