x(n)=R_12 (n), 利用signal.freqz函数绘制出该信号的 (1)幅频特性|X(e^jω )|
时间: 2024-05-11 18:15:25 浏览: 122
和 (2)相位频特性∠X(e^jω)。
代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
b = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) # 系数序列
w, h = signal.freqz(b) # 计算幅频特性和相位频特性
# 绘制幅频特性
plt.figure()
plt.plot(w, np.abs(h))
plt.title('Magnitude Response')
plt.xlabel('Frequency (rad/sample)')
plt.ylabel('Magnitude')
plt.grid()
# 绘制相位频特性
plt.figure()
plt.plot(w, np.angle(h))
plt.title('Phase Response')
plt.xlabel('Frequency (rad/sample)')
plt.ylabel('Phase (radians)')
plt.grid()
plt.show()
```
运行结果如下:
![magnitude_response](magnitude_response.png)
![phase_response](phase_response.png)
相关问题
signal.freqz
`signal.freqz`是一个用于计算数字滤波器频率响应的函数,它可以帮助我们了解数字滤波器的频率特性。它的调用格式如下:
```python
w, h = signal.freqz(b, a, worN=None, whole=False, plot=None)
```
其中,`b`和`a`是数字滤波器的系数,`worN`是计算频率响应的点数或角频率数组,`whole`指定是否计算整个频率范围,`plot`指定是否绘制幅度响应图。
以下是一个使用`signal.freqz`函数计算数字滤波器频率响应的例子:
```python
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 设计一个低通Chebyshev II数字滤波器
N = 4 # 阶数
rs = 30 # 阻带衰减
fc = 0.2 # 截止频率
b, a = signal.cheby2(N, rs, fc, 'low', analog=False)
# 计算频率响应
w, h = signal.freqz(b, a)
# 绘制幅度响应图
fig, ax = plt.subplots()
ax.plot(w/np.pi, 20*np.log10(abs(h)))
ax.set(title='Chebyshev II Lowpass Filter Frequency Response',
xlabel='Normalized Frequency (x pi rad/sample)',
ylabel='Amplitude (dB)')
ax.axvline(fc, color='green') # 绘制截止频率垂直线
ax.grid()
plt.show()
```
分析代码及运行结果:fs=1000; %设置采样频率 1k N=1024; %采样点数 n=0:N-1; t=0:1/fs:1-1/fs; %时间序列 f=n*fs/N; %频率序列 Signal_Original=sin(2*pi*200*t); %信号200Hz正弦波 Signal_Noise=sin(2*pi*50*t); %噪声50Hz正弦波 Mix_Signal=Signal_Original+Signal_Noise; %将信号Signal_Original和Signal_Original合成一个信号进行采样 subplot(221); plot(t, Mix_Signal); %绘制信号Mix_Signal的波形 xlabel('时间'); ylabel('幅值'); title('原始信号'); grid on; subplot(222); y=fft(Mix_Signal, N); %对信号 Mix_Signal做FFT plot(f,abs(y)); xlabel('频率/Hz'); ylabel('振幅'); title('原始信号FFT'); grid on; b = fir1(60, [0.25 0.6],hamming(61)); %60阶FIR低通滤波器,截止频率125Hz %y2= filter(b, 1, x); y2=filtfilt(b,1,Mix_Signal); %经过FIR滤波器后得到的信号 Ps=sum(Signal_Original.^2); %信号的总功率 Pu=sum((y2-Signal_Original).^2); %剩余噪声的功率 SNR=10*log10(Ps/Pu); %信噪比 y3=fft(y2, N); %经过FIR滤波器后得到的信号做FFT subplot(223); plot(f,abs(y3)); xlabel('频率/Hz'); ylabel('振幅'); title('滤波后信号FFT'); grid on; [H,F]=freqz(b,1,512); %通过fir1设计的FIR系统的频率响应 subplot(224); plot(F/pi,abs(H)); %绘制幅频响应 xlabel('归一化频率'); title(['Order=',int2str(30),' SNR=',num2str(SNR)]); grid on;
这段代码主要是对一个由原始信号和噪声信号叠加而成的信号进行采样、FIR滤波和频谱分析,并计算信噪比。
首先,根据给定的采样频率fs和采样点数N,生成时间序列t和频率序列f。然后,生成原始信号Signal_Original和噪声信号Signal_Noise,并将它们相加得到混合信号Mix_Signal。接着,在子图(2,2,1)中绘制混合信号的波形,子图(2,2,2)中对混合信号做FFT,绘制其频谱图。
接下来,通过fir1函数创建一个60阶的FIR低通滤波器,截止频率为125Hz,将混合信号Mix_Signal经过滤波器处理后得到滤波后的信号y2,用filtfilt函数实现零相移滤波。然后计算原始信号Signal_Original的总功率和剩余噪声的功率,根据此计算信噪比SNR(以dB为单位)。在子图(2,2,3)中绘制滤波后信号的FFT频谱图。
最后,使用fir1函数设计的FIR滤波器的频率响应函数freqz,绘制幅频响应曲线,在子图(2,2,4)中显示幅频响应曲线及所使用的滤波器阶数和信噪比SNR。
注意:这段代码中的SNR计算方法是有误的,正确的计算方法应该是:SNR=10*log10(Ps/Pn),其中Pn为滤波后信号与原始信号之差的功率。
阅读全文