2011-07-15 368 views
2

我有一個任務來實現Ram-Lak過濾器,但幾乎沒有給出任何信息(除了看fft,ifft,fftshift,ifftshift)。MATLAB如何在頻域實現Ram-Lak濾波器(Ramp濾波器)?

我有一個正弦圖,我必須通過拉姆叻過濾。也給出了投影的數量。

我試圖使用過濾器

     1/4    if I == 0 

(b^2)/(2*pi^2) *  0    if I even 

         -1/(pi^2 * I^2) if I odd 

b似乎是截止頻率,我有事情做與採樣率是多少?

而且據說兩個函數的卷積是在傅立葉空間中的簡單乘法。

我不明白如何在都實現了過濾器,尤其是無B給出,沒有告訴我是什麼,不知道如何將其應用到正弦圖,我希望有人能幫助我在這裏。我花了2小時搜索並試圖瞭解在這裏需要做什麼,但我無法理解如何實現它。

+0

你提的問題是非常不清楚。我是什麼?我們如何找到b?我沒有看過的文字使用相同的符號。 Ram Lak濾波器只是一個abs(f)函數,就像雙斜坡一樣。如果你告訴我這些變量是什麼,我將能夠幫助你。 – Phonon

+0

我的問題是我不知道。在文獻(即算法重建與無衍射源Page 72 - [鏈接](www.umiacs.umd.edu/~mingyliu/enee631/CTI_Ch03.pdf)他們使用只是一個I(或TETA那裏,採樣間隔) 燦你可以幫助我實現一個基於正弦圖和投影數量的簡單的abs()濾波器嗎? – mmlac

+0

試試這個鏈接http://laskin.mis.hiroshima-u.ac.jp/Kougi/07a/PIP/PIP12pr。 pdf這是一個很好的文字圖2B是一個Ram Lak濾波器 – Phonon

回答

7

你列出的公式是:如果你想要做逆Radon變換而不會在傅立葉域中濾波的中間結果。另一種方法是在空間域中使用卷積來完成整個濾波反投影算法,這在40年前可能更快;你最終會重新發布你發佈的公式。但是,我現在不會推薦它,特別是不適合你的第一次重建。你應該首先理解希爾伯特變換。

總之,這裏的一些Matlab代碼它執行強制性Shepp - 洛根幻像濾波反投影重建。我展示瞭如何使用Ram-Lak過濾器進行自己的過濾。如果我真的有動力,我會用一些interp2命令和總結替換氡/ iradon。

phantomData=phantom();

N=size(phantomData,1); 

theta = 0:179; 
N_theta = length(theta); 
[R,xp] = radon(phantomData,theta); 

% make a Ram-Lak filter. it's just abs(f). 
N1 = length(xp); 
freqs=linspace(-1, 1, N1).'; 
myFilter = abs(freqs); 
myFilter = repmat(myFilter, [1 N_theta]); 

% do my own FT domain filtering 
ft_R = fftshift(fft(R,[],1),1); 
filteredProj = ft_R .* myFilter; 
filteredProj = ifftshift(filteredProj,1); 
ift_R = real(ifft(filteredProj,[],1)); 

% tell matlab to do inverse FBP without a filter 
I1 = iradon(ift_R, theta, 'linear', 'none', 1.0, N); 

subplot(1,3,1);imagesc(real(I1)); title('Manual filtering') 
colormap(gray(256)); axis image; axis off 

% for comparison, ask matlab to use their Ram-Lak filter implementation 
I2 = iradon(R, theta, 'linear', 'Ram-Lak', 1.0, N); 

subplot(1,3,2);imagesc(real(I2)); title('Matlab filtering') 
colormap(gray(256)); axis image; axis off 

% for fun, redo the filtering wrong on purpose 
% exclude high frequencies to create a low-resolution reconstruction 
myFilter(myFilter > 0.1) = 0; 
ift_R = real(ifft(ifftshift(ft_R .* myFilter,1),[],1)); 
I3 = iradon(ift_R, theta, 'linear', 'none', 1.0, N); 

subplot(1,3,3);imagesc(real(I3)); title('Low resolution filtering') 
colormap(gray(256)); axis image; axis off 

Demonstration of manual filtering

+0

非常感謝,這對我有幫助! – mmlac