gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:17:38 25 4
gpt4 key购买 nike

我正在尝试以不同的方式对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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com