2014-03-30 48 views
0

我正在嘗試使用不同的方式爲MATLAB項目卷積並導出音頻信號y(t),其頻率響應爲h(t)。然而,大多數情況下它很簡單,當我試圖使用卷積定理對信號進行卷積時遇到了困難。在MATLAB中通過fft進行卷積定理

我可以輕鬆地使用fft()函數對兩個信號進行傅里葉變換,但是當我將這兩個結果相乘後,使用ifft()函數找到我的最終信號,程序總是輸出垃圾。我試着用填充零填充輸入,但它沒有做太多。

這裏是我現在的代碼的要點(繪圖功能已被刪除,以提高可讀性)。

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

F = Y*H; 

f = ifft(F); 

對於那些有興趣誰,音頻文件是具有22050採樣率一個38秒長的.wav文件。脈衝響應是-pi/2pi/2之間的餘弦函數。

在此先感謝,任何幫助,非常感謝。

+0

相關:http://stackoverflow.com/questions/21865918/point-product-with-fft – tashuhka

回答

2

我有點生鏽Convolution Theorem,所以我可以說錯了什麼;但我將突出兩件事情:

  • 在頻率產物應該是逐元素乘法,即 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); 

在頻域,它看起來像低通濾波工作。但是,如果您聽音頻,漢德爾曲目的結果並不奇妙。

enter image description here

不要忘記看看路易斯Mendo在here的很好的答案。