Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

Bài 4: THIẾT KẾ LỌC FIR

Ca: 2
Họ và tên: Phan Lưu Chí Thành
MSSV: 19200492

Bài 1a: Chương trình sau đây thực hiện lọc FIR thấp qua 8 bậc với cửa sổ tam giác (triang), tần số cắt
là 10 Hz. (Chép lại đề)

sampleRate = 100 #Tần số lấy mẫu


nSamples = 400 #Số mẫu
t = np.arange(nSamples)/sampleRate #Khoảng thời gian
x = np.cos(2*np.pi*0.5*t) + 0.2*np.sin(2*np.pi*2.5*t+0.1) + \
0.2*np.sin(2*np.pi*15.3*t) + 0.1*np.sin(2*np.pi*16.7*t + 0.1) + \
0.1*np.sin(2*np.pi*23.45*t+.8)
nyquistRate = sampleRate/2 #Tần số Nyquist
cutOffFreq = 10 #Hz
N = 8
wC = cutOffFreq/nyquistRate # Tần số cắt chuẩn hóa
b = signal.firwin(N, wC, window="triang")
y = signal.lfilter(b, 1, x)
w, h = signal.freqz(b,1, worN=1024)
plt.subplot(2,1,1)
plt.plot((w/np.pi)*nyquistRate, abs(h), linewidth=2)
plt.title('Đáp ứng tần số')
plt.xlabel('Tần số (Hz)')
plt.ylabel('Biên độ')
plt.subplot(2,1,2)
plt.plot(t, x, linewidth=2)
plt.title('Tín hiệu vào và ra')
plt.xlabel('Thời gian')
plt.ylabel('Biên độ')
plt.plot(t, y, 'r-', linewidth=2)
plt.subplots_adjust(top=1.5, hspace=0.5)
Bài 1b: Nhận xét tín hiệu vào và tín hiệu ra

Nhận xét: Tín hiệu ra đã được lọc bớt nhiễu so với tín hiệu vào

Bài 1c: Thay đổi bậc lọc từ 8 sang 16, 32, 64.
Nhận xét đáp ứng tần số của bộ lọc và tín hiệu ngõ ra?
Tín hiệu ngõ ra có được lọc hết được các tần số lớn hơn 2.5?

Nhận xét: Càng tăng số bậc lọc thì đáp ứng càng dốc ( sát với lý tưởng ) nhưng tín hiệu ra có biên độ
bị thay đổi so với tín hiệu vào
Bài 1d: Thực hiện lại bộ lọc với cửa sổ blackman, hamming, hann. (Không dùng hàm signal.firwin)
import matplotlib.pyplot as plt
from scipy import signal
import numpy as np
from scipy import fftpack as fft

fs = 100 #Tần số lấy mẫu


nSamples = 400 #Số mẫu
Ts = 1/fs
fc = 10 #Tần số cắt 10Hz
t = np.arange(nSamples)/fs #Khoảng thời gian
x = np.cos(2*np.pi*0.5*t) + 0.2*np.sin(2*np.pi*2.5*t+0.1) + \
0.2*np.sin(2*np.pi*15.3*t) + 0.1*np.sin(2*np.pi*16.7*t + 0.1) + \
0.1*np.sin(2*np.pi*23.45*t+.8)
#========================Đáp ứng lý tưởng===================
N = 32; #Bậc lọc
k = (N-1)/2;
n = np.arange(0,N,1);
OmegaC = 2*np.pi*fc*Ts
hnk = np.zeros(N);
for i in range (0,N,1):
if i == k:
hnk[i] = 1/5;
else:
hnk[i] = (OmegaC/np.pi) * np.sin(OmegaC*(i-k))/(OmegaC*(i-k));
#======================== Cửa sổ =============
wR = np.concatenate([np.ones(N)]); #Cửa sổ hình chữ nhật
wHam = 0.54 - 0.46*np.cos(2*np.pi*n/(N-1)); #Cửa sổ Hamming
wHan = 0.5 - 0.5*np.cos(2*np.pi*n/(N-1)); #Cửa sổ Hann
wB = 0.42 - 0.5*np.cos(2*np.pi*n/(N-1)) + 0.08*np.cos(4*np.pi*n/(N-1)); #Cửa sổ Blackman
#======================== Đáp ứng bộ lọc ===================
hn = wB * hnk; # Sử dụng cửa sổ nào thì thay wB bằng biến tương ứng
#======================== Kiểm tra =========================
a = [1];
w, H = signal.freqz(hn, worN = 512, whole = True);
f = w/(2*np.pi*Ts)
Habs = abs(H);
Hpha = np.angle(H);
y = signal.convolve(x,hn);

plt.subplot(3,1,1)
plt.plot(x);
plt.title('Tin hieu vao')
plt.xlabel('t');
plt.ylabel('s');

plt.subplot(3,1,2)
plt.plot(y, 'r');
plt.title('Tin hieu ra')
plt.xlabel('t');
plt.ylabel('y');

plt.subplot(3,1,3)
plt.plot(f,Habs);
plt.xlabel('w');
plt.ylabel('Habs');
plt.show()

Cửa sổ Blackman (hn = wB * hnk)

Cửa sổ Hamming (hn = wHam * hnk)


Cửa sổ Hann (hn = wHan * hnk)
Bài 1e: Đoạn chương trình sau thực hiện lại với cửa số kaiser. (Chép lại đề)
sampleRate = 100 #Tần số lấy mẫu
nSamples = 400 #Số mẫu
t = np.arange(nSamples)/sampleRate #KHoảng thời gian
x = np.cos(2*np.pi*0.5*t) + 0.2*np.sin(2*np.pi*2.5*t+0.1) + \
0.2*np.sin(2*np.pi*15.3*t) + 0.1*np.sin(2*np.pi*16.7*t + 0.1) + \
0.1*np.sin(2*np.pi*23.45*t+.8)
nyquistRate = sampleRate/2 #Tần số Nyquist
cutOffFreq = 10 #Hz
#Độ rộng chuyển tiếp từ dải thông (passband) sang dải chặn (stopband) là 5Hz
width = 5.0/nyquistRate
rippleInDB = 60 # Độ dợn sóng dải chặn
N, beta = signal.kaiserord(rippleInDB, width)
#----
wC = cutOffFreq/nyquistRate # Tần số cắt
b = signal.firwin(N, wC, window=('kaiser', beta))
y = signal.lfilter(b, 1, x)
w, h = signal.freqz(b,1, worN=1024)
#Độ dịch pha
delay = 0.5 * (N-1) / sampleRate
#Vẽ tín hiệu và đáp ứng
plt.subplot(2,1,1)
plt.plot((w/np.pi)*nyquistRate, abs(h), linewidth=2)
plt.title('Đáp ứng tần số')
plt.xlabel('Tần số (Hz)')
plt.ylabel('Biên độ')
plt.subplot(2,1,2)plt.plot(t, x, linewidth=2)
plt.plot(t -delay, y, 'r-', linewidth=2)
plt.title('Tín hiệu vào')
plt.xlabel('Thời gian')
plt.ylabel('Biên độ')
plt.subplots_adjust(top=1.5, hspace=0.5)

You might also like