FIR filter basic implementation problem

6 次查看(过去 30 天)
Hi All
I am a beginner in signals theory and, while trying to implement basic code for upsamling, downsamling and filtering of the simple siusoid and noise signal, I encountered some issues with implementation of FIR filter.
The Sinusoid frequency is 0.1Hz and Sampling Frequency 1Hz. I calculated the Low pass FIR filter parameters using "firpmod" for the assumptions Lower Freq 0Hz; Upper Frequency 0.12Hz; passband ripple 0.01 (linear value) ; Stopband ripple 0.01 (linear value), Sampling Freq 1Hz. Later I calculated coefficients of square root cosine FIR filter for 1 response up to 0.25 rad/sec and 0 response above 0.26 rad/sec which is around but above 0.1Hz. The frequency domain is as expected but the Filter seems to truncate sinusoid in time domain for some initial time - therefore I am confused with FIR filter parameters selection - what can be wrong in such implementation causing filtering of the sinusoid initially?.Please see below code and response of the code:
clear all
close all
fm = 0.1; % message signal frequency
Fs = 1;%sampling freq
Ts = 1/Fs; %sampling time
n=0:Ts:999.9; %time range
N=size(n,2);% Size of the n space
dFs=Fs/N; % size of the dFs for Frequency domain plot
sine_wave =sin(2*pi*fm*n);% generating sinusoid
random= 2* round(rand(1,length(n)))-1; % generating noise
% Calculating the Low pass FIR filter parameters for the assumption Lower Freq 0Hz; Upper Frequency 0.12Hz; passband ripple 0.01 (linear) ; Stopband ripple 0.01 (linear), Sampling Freq 1Hz
Order = firpmord([0 0.12],[1 0],[0.01 0.01], 1)
coeffs1 = firls(Order,[0 0.25 0.26 1],[1 1 0 0]); % calculating coeficcients for FIR filter - 0.25 and 0.26 are frequencies in radians/sec
sin_bwlimited = filter(coeffs1,0.1,sine_wave); %filtered sinusoid
random_bwlimited = filter(coeffs1,0.1,random); % filtered noise
subplot(5,1,1);% dividing window
plot(n(1:100),sin_bwlimited(1:100),'--or');
subplot(5,1,2)
plot(n(1:100),random_bwlimited(1:100), '--or');% plottong only 100 points
f3 = 0:dFs:Fs/2-dFs;% space of freq domain
Y = fft(sin_bwlimited)/N;
subplot(5,1,3);
plot(f3,2*abs(Y(1:N/2))) ;
R = fft(random_bwlimited)/N;
subplot(5,1,4);
plot(f3,2*abs(R(1:N/2))) ;

采纳的回答

Shaik
Shaik 2023-5-13
Hi,
Check this
clear all
close all
fm = 0.1; % message signal frequency
Fs = 1; % sampling freq
Ts = 1/Fs; % sampling time
n = 0:Ts:999.9; % time range
N = size(n,2); % size of the n space
sine_wave = sin(2*pi*fm*n); % generating sinusoid
random = 2*round(rand(1,length(n)))-1; % generating noise
% Calculating the Low pass FIR filter parameters
% for the assumption Lower Freq 0Hz; Upper Frequency 0.12Hz;
% passband ripple 0.01 (linear) ; Stopband ripple 0.01 (linear),
% Sampling Freq 1Hz
Order = firpmord([0 0.12],[1 0],[0.01 0.01], 1);
coeffs1 = firls(Order,[0 0.25 0.26 1],[1 1 0 0]); % calculating coeficcients for FIR filter - 0.25 and 0.26 are frequencies in radians/sec
sin_bwlimited = filter(coeffs1, 1, sine_wave); % filtered sinusoid
random_bwlimited = filter(coeffs1, 1, random); % filtered noise
subplot(5,1,1); % dividing window
plot(n, sine_wave, '-b');
hold on;
plot(n, sin_bwlimited, '--r');
xlabel('Time');
ylabel('Signal');
title('Sinusoidal Signal with Limited Bandwidth');
subplot(5,1,2);
plot(n, random, '-b');
hold on;
plot(n, random_bwlimited, '--r');
xlabel('Time');
ylabel('Signal');
title('Random Noise with Limited Bandwidth');
f3 = 0:Fs/N:Fs/2-Fs/N; % space of freq domain
Y = fft(sin_bwlimited)/N;
subplot(5,1,3);
plot(f3, 2*abs(Y(1:N/2))) ;
xlabel('Frequency');
ylabel('Magnitude');
title('Frequency Response of Filtered Sinusoidal Signal');
R = fft(random_bwlimited)/N;
subplot(5,1,4);
plot(f3, 2*abs(R(1:N/2))) ;
xlabel('Frequency');
ylabel('Magnitude');
title('Frequency Response of Filtered Random Noise');
subplot(5,1,5);
plot(coeffs1, '-o');
xlabel('Sample');
ylabel('Coefficient');
title('FIR Filter Coefficients');

更多回答(1 个)

Lukasz
Lukasz 2023-5-14
编辑:Lukasz 2023-5-14
Thanks Shaik
Thank you for your help. The sinusoid amplitude is still affected during first 10 samples. I addition, by using the more advanced plot, it appeared that filtered sinusoid is phase shifted if related to nonfiltered signal- which is probably more serious and confusing.
  2 个评论
Star Strider
Star Strider 2023-5-14
@Lukasz — To avoid the phase distortion in the ffiltered signal, use the filtfilt function, not filter.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Digital Filter Analysis 的更多信息

产品


版本

R2015a

Community Treasure Hunt

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

Start Hunting!

Translated by