matlab - 通过MATLAB中的fft进行卷积定理

标签 matlab audio fft convolution

我正在尝试以不同的方式对MATLAB项目进行卷积并导出具有频率响应y(t)的音频信号h(t)。在大多数情况下,这一直很简单,但是,在尝试使用卷积定理对信号进行卷积时遇到了困难。

我可以使用fft()函数轻松地对两个信号进行傅立叶变换,但是当我将这两个结果相乘后,再使用ifft()函数来查找最终信号,程序总是输出垃圾。我试过用零填充输入,但是并没有做太多事情。

这是我目前所拥有代码的要点(出于可读性考虑,删除了绘图功能)。

Y = fft(y);
H = fft(h);

F = Y*H;

f = ifft(F);

对于那些感兴趣的人,音频文件是38秒长的.wav文件,采样率为22050。脉冲响应是-pi/2pi/2之间的余弦函数。

在此先感谢您的帮助。

最佳答案

我对Convolution Theorem有点使用rust ,所以我可以说错什么。但我要强调两件事:

  • 频率乘积应为逐元素乘法,即F=Y.*H
  • 频率响应应该是频率的余弦,而不是时间的余弦。我想您想要一个可以进行低通滤波的频率响应。

  • 我对这些想法有些反感,这就是我得到的:
    clear all; close all; clc;
    
    % Signal
    load handel.mat;
    %sound(y,Fs)
    N = numel(y);
    t = linspace(0,(N-1)/Fs,N);
    
    % Response
    H = abs(cos(linspace(0,pi,N))).';
    
    % FFT product
    Y = fft(y);
    h = abs(ifft(H));
    F = Y.*H;
    f = abs(ifft(F));
    
    % Plot
    figure('Name','Time-domain');
    subplot(3,1,1); plot(t,y); title('Signal');
    subplot(3,1,2); plot(t,h); title('System');
    subplot(3,1,3); plot(t,f); title('Output');
    figure('Name','Frequency-domain');
    subplot(3,1,1); plot(abs(Y)); title('Signal');
    subplot(3,1,2); plot(abs(H)); title('System');
    subplot(3,1,3); plot(abs(F)); title('Output');
    
    % Play
    sound(y,Fs);
    sound(f,Fs);
    

    在频域中,低通滤波似乎正在起作用。但是,如果您收听音频,则Handel轨道的结果并不惊人。

    不要忘记看看here中的Luis Mendo的好答案。

    关于matlab - 通过MATLAB中的fft进行卷积定理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22740498/

    相关文章:

    javascript - 在播放其他音频时使音频静音

    algorithm - 卷积的有效方法,如求和评估

    matlab - 巴特沃斯带通滤波器的命令是什么

    image - 如何在 Matlab 中显示 .bin 图像?

    嵌套匹配的正则表达式

    java - 如何使用具有可变正弦波大小和整数而不是短路的 FFT 代码?

    python - 数据集的傅立叶平滑

    matlab - 如何在matlab中计算每页STD?

    android - 无法在Android中使用MediaPlayer播放MediaStore.Audio歌曲

    c++ - 将静音音频数据写入文件ffmpeg C++