相关疑难解决方法(0)

使用fftw和window函数生成正确的谱图

对于项目,我需要能够从.WAV文件生成频谱图.我已经读过以下应该做的事情:

  1. 获得N(变换大小)样本
  2. 应用窗口功能
  3. 使用样本进行快速傅里叶变换
  4. 规范化输出
  5. 生成频谱图

在下图中,您可以看到两个使用汉宁窗函数的10000 Hz正弦波谱图.在左侧,您可以看到由audacity生成的谱图,右侧是我的版本.你可以看到我的版本有更多的线/噪音.这是不同箱子的泄漏?如何获得像大胆产生的清晰图像.我应该做一些后期处理吗?我还没有做任何规范化,因为不完全了解如何这样做.

在此输入图像描述

更新

我发现教程解释了如何在c ++中生成频谱图.我编译了源代码,看看我能找到什么差异.

说实话,我的数学非常生疏,所以我不确定规范化在这里做了什么:

    for(i = 0; i < half; i++){
        out[i][0] *= (2./transform_size);
        out[i][6] *= (2./transform_size);
        processed[i] = out[i][0]*out[i][0] + out[i][7]*out[i][8];
        //sets values between 0 and 1?
        processed[i] =10. * (log (processed[i] + 1e-6)/log(10)) /-60.;
    }
Run Code Online (Sandbox Code Playgroud)

在这之后我得到了这个图像(顺便说一下,我把颜色颠倒了):

在此输入图像描述

然后我看一下我的声音库和教程之一提供的输入样本的差异.我的方式更高,所以我手动归一化是将其除以因子32767.9.然后我去看看这个看起来相当不错的图片.但除以这个数字似乎是错误的.我希望看到一个不同的解决方案.

在此输入图像描述

这是完整的相关源代码.

void Spectrogram::process(){
    int i;
    int transform_size = 1024;
    int half = transform_size/2;
    int step_size = transform_size/2;
    double in[transform_size];
    double processed[half];
    fftw_complex *out;
    fftw_plan p; …
Run Code Online (Sandbox Code Playgroud)

c++ fft fftw spectrogram

10
推荐指数
2
解决办法
6198
查看次数

标签 统计

c++ ×1

fft ×1

fftw ×1

spectrogram ×1