2014-12-04 49 views
0

一個Sincs總和的過濾器我想實現一個過濾器,看起來像實現在Matlab

SoS Filter

在Matlab

。我有:

omegas = (-length(t)/2:length(t)/2)*2*pi/tau/10; 
SOS_freq_sum = zeros(1,length(omegas)); 
for i = 1:length(K_set) 
    k = K_set(i); 
    SOS_freq_sum = SOS_freq_sum + b_k(i)*sinc(omegas/(2*pi/tau)-k); 
end 
SOS_filter_in_frequency = (tau/sqrt(2*pi))*((SOS_freq_sum)'); 

如何使用這個篩選我的數據? Matlab的濾波函數爲傳遞函數定義分子和denom係數,但不是SOS形式。有沒有辦法做到這一點,而不需要將輸入信號轉換到頻域?

非常感謝

+1

是的,除了將您的數據轉換到頻域外,沒有看到任何其他方式。另一種可能性是採用濾波器的**反**快速傅里葉變換,使其處於時域,然後用'conv'在時域中用此濾波器對輸入信號進行手動卷積。但是,您可以**執行一些數學操作並將'G'轉換爲傳遞函數格式,並且可以在那裏提取分子和分母系數,但是這類工作不適合在此處詢問,並且可能更多沿着DSP StackExchange:http://dsp.stackexcahnge.com。 – rayryeng 2014-12-04 16:40:29

回答

1

濾波的信號可以被看作是與一個(時域)濾波器內核卷積您的時域信號。如果你有信號的濾波器內核,你可以用conv()進行卷積運算。

類似的時域卷積是在頻域中的乘法,因此您還可以將濾波器的頻率響應與信號的傅里葉變換相乘。然後逆傅里葉變換結果得到你的濾波信號。

您似乎已經計算了濾波器的頻率響應。因此,您可以對信號進行傅立葉變換,然後乘以(如果需要,加適當的零加),然後進行逆傅里葉變換,或者逆傅里葉變換您的濾波器以獲取內核並將其與信號進行卷積。

對於在頻域中執行卷積的大型數據集和濾波器,速度可能會更快,但是我懷疑這對於一維信號來說是顯而易見的。

大綱代碼:

ftsignal=fft(signal); 
ftsignal=fftshift(signal); %I think this makes it the same as your frequency response. 
ftfiltsignal=ftsignal.*frequecyresponse; %if these are not the same size you will need to zero-pad 
filtsignal=ifft(ftfiltsignal); 

如果你真的想避免由於某種原因,頻域卷積:

filterkernel=ifft(frequencyresponse); 
filteredsignal=conv(signal, filterkernel, 'same'); 

注意這種方法會產生邊緣效應,如果你過濾它可以顯著與你的信號長度相比,規模相當大。

+0

OP在詢問是否有辦法做到這一點**而不訴諸頻域。 – rayryeng 2014-12-04 18:35:53