我正在尝试以不同的方式对MATLAB项目进行卷积并导出具有频率响应y(t)
的音频信号h(t)
。在大多数情况下,这一直很简单,但是,在尝试使用卷积定理对信号进行卷积时遇到了困难。
我可以使用fft()
函数轻松地对两个信号进行傅立叶变换,但是当我将这两个结果相乘后,再使用ifft()
函数来查找最终信号,程序总是输出垃圾。我试过用零填充输入,但是并没有做太多事情。
这是我目前所拥有代码的要点(出于可读性考虑,删除了绘图功能)。
Y = fft(y);
H = fft(h);
F = Y*H;
f = ifft(F);
对于那些感兴趣的人,音频文件是38秒长的.wav文件,采样率为
22050
。脉冲响应是-pi/2
和pi/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/