how to use freqz function correctly

조회 수: 76 (최근 30일)
Abdel
Abdel 2024년 1월 10일
답변: Paul 2024년 1월 10일
Hello,
Im trying to visualize the frequency response using the freqz function for a filter. My sampling frequency is 15 MHz, while the signal frequency is only 1 kHz. Due to this large difference between the sampling frequency and the signal frequency, the resulting frequency response plot is not clear. Is there anything i can do ?
Im using freqz(x), in the command window.

답변 (3개)

Hassaan
Hassaan 2024년 1월 10일
편집: Hassaan 2024년 1월 10일
% Filter design
N = 10; % Filter order
Fcut = 2000; % Cut-off frequency of 2 kHz
Fs = 15000000; % Sampling frequency of 15 MHz
% Design a low-pass FIR filter
b = fir1(N, Fcut/(Fs/2));
a = 1; % For FIR filters, the denominator is 1
% Frequency range of interest
f_min = 0; % Minimum frequency in Hz
f_max = 2000; % Maximum frequency in Hz (around your signal frequency)
% Number of points to evaluate
n_points = 4096;
% Frequency vector (w radians/sample = f cycles/sec * (1/Fs) sec/sample * 2*pi rad/cycle)
% which is inverse of f = w * Fs / (2*pi) --- Thank you 'paul' for the
% sugguestion
w = linspace(0, f_max*2*pi/Fs, n_points);
% Calculate the frequency response
[h, w] = freqz(b, a, w);
% Convert rad/sample to Hz for plotting
f = w * Fs / (2*pi);
% Plot the magnitude response
figure;
plot(f, abs(h));
title('Frequency Response of the Designed FIR Filter');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
grid on;
%Optional: If you want to plot phase response, uncomment the following lines
figure;
plot(f, angle(h));
title('Phase Response of the Designed FIR Filter');
xlabel('Frequency (Hz)');
ylabel('Phase (Radians)');
grid on;
In this code, the fir1 function designs a 10th-order low-pass FIR filter with a cutoff frequency of 2 kHz, which should be suitable for your 1 kHz signal. The frequency response is plotted for frequencies up to 2 kHz, which provides a more focused view on the relevant part of the spectrum. Feel free to adjust the filter order (N) and the cutoff frequency (Fcut) as per your specific requirements.
---------------------------------------------------------------------------------------------------------------------------------------------------
If you find the solution helpful and it resolves your issue, it would be greatly appreciated if you could accept the answer. Also, leaving an upvote and a comment are also wonderful ways to provide feedback.
Professional Interests
  • Technical Services and Consulting
  • Embedded Systems | Firmware Developement | Simulations
  • Electrical and Electronics Engineering
Feel free to contact me.
  댓글 수: 2
Paul
Paul 2024년 1월 10일
Is this line correct?
% Frequency vector (in radians/sample)
w = linspace(0, f_max/(Fs/2), n_points);
Seems like it should be
% Frequency vector (w radians/sample = f cycles/sec * (1/Fs) sec/sample * 2*pi rad/cycle)
% which is inverse of f = w * Fs / (2*pi)
w = linspace(0, f_max*2*pi/Fs, n_points);
% Calculate the frequency response
[h, w] = freqz(b, a, w);
% Convert rad/sample to Hz for plotting
f = w * Fs / (2*pi);
Hassaan
Hassaan 2024년 1월 10일
@Paul you are right. I have fixed as per your suggestion. Thank you.

댓글을 달려면 로그인하십시오.


Star Strider
Star Strider 2024년 1월 10일
You can set the 'XLim ' range for the subplot axes, however that may be a bit of a stretch even then. Another option is to signifficantly increase the size of the fft that is calculated, although that could take a shile to calculate.
Try this —
Fs = 15E+6;
Fn = Fs/2;
Wp = 1/Fn; % Passband Frequency (Normalised)
Ws = 2/Fn; % Stopband Frequency (Normalised)
Rp = 1; % Passband Ripple
Rs = 60; % Passband Ripple (Attenuation)
[n,Wp] = ellipord(Wp,Ws,Rp,Rs); % Elliptic Order Calculation
[z,p,k] = ellip(n,Rp,Rs,Wp); % Elliptic Filter Design: Zero-Pole-Gain
[sos2,g2] = zp2sos(z,p,k); % Second-Order Section For Stability
figure
freqz(sos2, 2^16, Fs) % Filter Bode Plot
figure
freqz(sos2, 2^20, Fs) % Filter Bode Plot
set(subplot(2,1,1), 'XLim',[0 10])
set(subplot(2,1,2), 'XLim',[0 10])
figure
freqz(sos2, 2^24, Fs) % Filter Bode Plot
set(subplot(2,1,1), 'XLim',[0 5])
set(subplot(2,1,2), 'XLim',[0 5])
This uses a lowpass elliptic filter as the example. Narrow the 'XLim' values to your area-of-interest. Longer fft lengths than this are primarily a problem of available memory.
.

Paul
Paul 2024년 1월 10일
If x is a digitalFilter object, then freqz can be called as
freqz(x,f,fs);
where f is vector of frequencies of interest to visualize the frequency response and fs is the sampiling frequency (15e6).
If x is not a digitalFilter object, then freqz(x) is not a valid, documented, call to freqz and you'll have to provide more information on what x is.

카테고리

Help CenterFile Exchange에서 Digital Filter Analysis에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

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

Start Hunting!

Translated by