真正的 fft 错误 - ffmpeg

Posted

技术标签:

【中文标题】真正的 fft 错误 - ffmpeg【英文标题】:Real fft error - ffmpeg 【发布时间】:2016-06-21 17:28:04 【问题描述】:

我正在尝试将 ffmpegs fft 实用程序用于名为 real fft(rdft) 的音频样本。

但我有 SIGSEGV 错误。代码很简单。

 static void fft(float* data)
    RDFTContext * ctx = av_rdft_init(Globals::WindowSizePower, DFT_R2C)
    av_rdft_calc(ctx, data);
    av_rdft_end(ctx);
    av_free(ctx);
  

定义的常量是

static const int WindowSize = 1024;
static const int WindowSizePower = 10;

谁能告诉我我做错了什么?我试图在互联网上找到使用此 ffmpeg 实用程序的示例,但我没有找到任何示例。

编辑:

这是调用这个函数的函数

void fftInit(float* correction)
        m_fft_data = new float[Globals::WindowSize]();
        memcpy(m_fft_data, correction, sizeof(float)*Globals::WindowSize);
        for(int i = 0; i < Globals::WindowSize; ++i)
            m_fft_data[i] *= m_data[i];
        

        FFMPEGFFT::fft(m_fft_data);
    

输入数据已正确分配。在进入这部分之前,我测试了提取的数据。

【问题讨论】:

【参考方案1】:

av_rdft_end 之后调用av_free不正确av_rdft_end 已经释放了ctx 指向的内存空间。

(而且av_rdft_init后面少了一个分号。)

编辑:

第二个问题是运算符new[] 返回不正确对齐的指针。使用例如av_malloc 代替。 av_malloc 分配一个适合所有内存访问(包括 SSE 指令)的对齐的块。

【讨论】:

缺少分号是复制错误。但是我稍后会在 av_rdft_calc 函数上遇到错误... @Steva:data 分配是否正确?你能说明fft函数是如何被调用的吗? 当然,我编辑了问题。数据分配正确,我先测试了。 @Steva:fftInit 代码似乎没问题。问题必须在您的代码中的其他地方。您是否使用 valgrind 工具检查过代码?无论如何,av_free 调用仍然不正确。 @Steva:0 不是问题。我得出的结论是您的运算符 new[] 返回不正确对齐的指针。使用例如av_malloc 代替。 av_malloc 分配一个块,其对齐方式适合所有内存访问(包括 SSE 指令)。

以上是关于真正的 fft 错误 - ffmpeg的主要内容,如果未能解决你的问题,请参考以下文章

FFT 算法错误

内存要求:N 点 FFT(出现错误)

错误结果绘图窗口 FFT

FFT算法得到错误的声音频率值

假设 FFT 结果错误

FFT 频率分析似乎得到了错误的值