MATLAB Answers

Building Low-pass filter with Sinc function

65 views (last 30 days)
Liang
Liang on 18 Sep 2020
Commented: Star Strider on 23 Sep 2020
Dear Community,
I am trying to build a low-pass filter by using a sinc function for my homework assignment. I then use convolution to later filter an audio sample with this filter. However, when I plot the filter in a bode plot it looks like a high-pass filter. Can anyone tell me what I'm doing wrong?
Thanks in advance!
%% Downsampled by K with low-pass filter
% Build filter
clear all; close all
K = 2;
fs = 1600;
N = 51;
n = (-(N-1)/2:1:(N-1)/2);
h = (1/K) * sinc((pi/K)*n);
% Plot frequency response filter
[H, H_vec] = fftFreq(h, fs, 1 );
figure
plot(H_vec*2*pi/fs, abs(H))
filt_tf =tf(h,1,1/fs,'Variable','z^-1');
figure
bode(filt_tf)
function [ X , f ] = fftFreq( data , fs, w )
% Number of FFT points
NFFT = length( data );
% calculate FFT
X = fft(data .* w);
% calculate frequency spacing
df = fs/NFFT;
% calculate unshifted frequency vector
f = (0:(NFFT-1)) * df;
end

  1 Comment

Bas Zweers
Bas Zweers on 22 Sep 2020
You need to use fftshift for the correct frequency plot

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 18 Sep 2020
I am not exactly certain what the problem is from a theoretical prespective (I will leave it to you to explore that), however the sinc pulse is too narrow. Increase ‘K’ to 4 or more, and you get a lowpass result.
Also, since this is a discrete filter, the freqz function will do what you want:
figure
freqz(h,1,2^16,fs)
If you are going to use it as a FIR discrete filter, do the actual filtering with the filtfilt function for the best results.
.

  4 Comments

Show 1 older comment
Star Strider
Star Strider on 18 Sep 2020
As always, my pleasure!
I have not investigated the sinc function in that respect. Taking its Fourier transform could provide significant insight (analytically if possible, numerically if that is all that is available). The Fourier transform will reveal it to be a square wave (actually rectangle function) in the frequency domain. Mapping the time-domain parameters to the frequency domain parameters to produce the desired design remains the issue.
Liang
Liang on 22 Sep 2020
UPDATE:
Apparently, I made a mistake in the mathematical procedure to come up with my sinc low-pass filter. The pi in the sinc function shouldn't be there. Now everything is working correctly. Thanks again for the help.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!