FIR filter basic implementation problem

7 visualizaciones (últimos 30 días)
Lukasz
Lukasz el 13 de Mayo de 2023
Comentada: Lukasz el 15 de Mayo de 2023
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))) ;

Respuesta aceptada

Shaik
Shaik el 13 de Mayo de 2023
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');

Más respuestas (1)

Lukasz
Lukasz el 14 de Mayo de 2023
Editada: Lukasz el 14 de Mayo de 2023
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 comentarios
Star Strider
Star Strider el 14 de Mayo de 2023
@Lukasz — To avoid the phase distortion in the ffiltered signal, use the filtfilt function, not filter.
Lukasz
Lukasz el 15 de Mayo de 2023
Thanks. It works well now

Iniciar sesión para comentar.

Etiquetas

Productos


Versión

R2015a

Community Treasure Hunt

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

Start Hunting!

Translated by