MATLAB Frequency domain filtering in Matlab

AI Thread Summary
The discussion centers on implementing Fourier domain filters in Matlab, specifically the cosine, Shepp-Logan, and Hann/Hamming window filters. The filters are defined by multiplying a ramp filter with respective functions, but the results are not as expected. The parameter "d" is crucial, affecting the filters' appearance, with specific values yielding more accurate results. Users speculate that "d" relates to normalization and cut-off frequency, suggesting it should be less than the Nyquist frequency to avoid aliasing. There is confusion regarding the use of frequency versus angular frequency in the filter definitions, particularly the necessity of dividing or multiplying by constants like 2π. The discussion highlights the importance of correctly defining parameters and understanding their impact on filter performance.
roam
Messages
1,265
Reaction score
12
I am trying to implement several filters in Matlab for Fourier domain filtering. They are the cosine, Shepp-Logan, and Hann/Hamming window filters. These filters are defined as multiplying the ramp filter by the cosine function, sinc function, and Hann/Hamming windows respectively.

This is how the responses of these filters should look like:

tiki-download_file.php?fileId=433&display.jpg

However, this is what I am getting:

filters.jpg


I have defined the filters exactly as they are defined in this Matlab function, with a parameter ##d## that stretches the filters:

Code:
w=linspace(0, 1, 181).'; % Frequency axis

d=0.33;

Hr = abs(w); % Ramp filter

H=Hr.* cos(w/(d)); % Cosine filter
H(H<0) = 0; 

H=Hr.* (sin(w/d)./(w/d)); % Shepp-Logan filter
H(H<0) = 0; 

H=Hr.* (1+cos(w./d)) / 2; % Hann filter
H(H<0) = 0; 

H=Hr.* (.54 + .46 * cos(w/d)); % Hamming filter
H(H<0) = 0;

For instance, if I change it to ##d=0.3##, the Hann/Hamming filters start to look correct. And at ##d=0.65##, the cosine filter looks more correct:

d3filter.jpg


So, what is the justification for using the parameter ##d##? And is there an algorithm for calculating it accurately for each filter?

Any explanation would be greatly appreciated.
 
Physics news on Phys.org
What do you get for d=1? I am guessing it might have to do with normalization?
 
  • Like
Likes roam
PhysicoRaj said:
What do you get for d=1? I am guessing it might have to do with normalization?
The second plot above is d=1. I suspect there is a degree/radian/frequency units issue.
 
  • Like
Likes PhysicoRaj and roam
I tried to plot the graphs without the ##d## but instead using some kind of normalization. This is the combination that produced the correct results:

$$H=|\omega| \cos \left( \frac{\omega}{2 \pi} \right)$$

$$H=|\omega| \left( \frac{\sin \left( \frac{\omega}{2 \pi} \right)}{\left( \frac{\omega}{2 \pi} \right)} \right)$$

$$H = |\omega| \frac{1+\cos(\omega \pi)}{2}$$

$$H = |\omega| (0.54 + 0.46 \cos (\omega \pi))$$

Is there any reason why we need to divide the frequency in the first two by ##2 \pi##, but multiply it by ##\pi## in the Hann and Hamming window?

It was a trial and error approach, so I am not sure. :confused:
 
d has to do with cut-off frequency I guess. It must be lower than Nyqvist frequency to prevent aliasing and d=0.33 means that it is only 33% of Nyqvist frequency.
 
@roam You seem to be using Cos(ω/2π) on your calculations. The argument in a trig function should not be frequency (ω/2π). It should be in angular frequency (ω). This could be some of your problem.
 

Similar threads

Back
Top