Professional Documents
Culture Documents
DSP_2024_Lab1_22207053 (1)
DSP_2024_Lab1_22207053 (1)
ipynb - Colab
keyboard_arrow_down Khoa Điện tử Viễn thông- Trường Đại học Khoa học tự nhiên
Mục đích:
-Làm quen với xử lý tín hiệu với Python
-Tạo được các tín hiệu cơ bản
-Hiểu rõ các định lý lấy mẫu tín hiệu.
1, n = 0
Xung lực đơn vị δ(n) = {
0, n ≠ 0
Bài 1a:
Một xung lực đơn vị d[n] có chiều dài N được tạo bằng câu lệnh: dn = signal.unit_impulse(N)
Đoạn chương trình sau tạo ra một xung lực đơn vị có số mẫu là 8
#Đây là 1 comment
dn = signal.unit_impulse(8) #Hàm unit_impulse được lấy từ thư viện signal
plt.stem(dn)
plt.title("Xung lực đơn vị")
plt.xlabel("Samples (Mẫu)")
plt.ylabel("Amplitude (Biên độ)")
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 1/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
Bài 1b:
Đoạn chương trình sau thực hiện vẽ xung lực đơn vị có chiều dài là 8 và delay 2 đơn vị, δ(n − 2)
dn2 = signal.unit_impulse(8,2)
plt.stem(dn2)
plt.title("Xung lực đơn vị delay 2 mẫu")
plt.xlabel("Samples (Mẫu)")
plt.ylabel("Amplitude (Biên độ)")
Bài 1c:
Viết chương trình tạo ra xung lực đơn vị có chiều dài là 20 và delay 5
dn2 = signal.unit_impulse(20,5)
plt.stem(dn2)
plt.title("Xung lực đơn vị delay 2 mẫu")
plt.xlabel("Samples (Mẫu)")
plt.ylabel("Amplitude (Biên độ)")
Bài 1d: Tín hiệu x(n) = u(n) - u(n-5) được thực hiện bởi chương trình sau
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 2/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
n = np.arange(5) #Tạo 1 mảng 5 phần tử n =[0, 1, 2, 3, 4]
x = np.ones(5) #Tạo 1 mảng 5 phần tử có giá trị 1, n = [1, 1, 1, 1, 1]
plt.stem(n,x)
plt.title("Bậc đơn vị")
plt.xlabel("Samples (Mẫu)")
plt.ylabel("Amplitude (Biên độ)")
x = np.concatenate([np.zeros(5), np.ones(5)] )
n = np.arange(-5,5)
plt.stem(n, x)
plt.title("Bậc đơn vị")
plt.xlabel("Samples (Mẫu)")
plt.ylabel("Amplitude (Biên độ)")
Bài 1f: Viết chương trình tạo ra bậc đơn vị có chiều dài là 20, delay 5 mẫu u(n-5)
n = np.arange (20)
x = np.concatenate([np.zeros(5), np.ones(15)])
plt.stem(n, x)
(-2, 2)
Bài 2b: Viết chương trình tạo sóng vuông tần số 10Hz, tần số lấy mẫu là 3KHz, duty cycle 75%
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 3/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
t = np.linspace(0, 1, 3000, endpoint=False) #Tạo 1 dải tuyến tính từ 0 -> 1, số mẫu là 3000, không lấy mẫu cuối cùng
s = signal.square(2 * np.pi * 10 * t, duty = 0.75) #Tạo sóng vuông tần số 10Hz, duty cycle = 75%
plt.plot(t, s)
[<matplotlib.lines.Line2D at 0x236b59a44d0>]
Bài 3a: Chương trình sau tạo ra một sóng sin tần số 2Hz, biên độ là 2V, pha ban đầu bằng 0, số mẫu N = 100
plt.stem(t,y, 'r' )
plt.title("Tín hiệu hình sin")
plt.xlabel("Time[Samples (Mẫu)]")
plt.ylabel("Amplitude (Biên độ)")
Bài 3b: Viết chương trình tạo ra sóng sin biên độ 3V, tần số 1Hz, pha ban đầu 90 độ
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 4/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
fs = 100 # Tốc độ lấy mẫu (Hz)
f = 1 # Tần số của tín hiệu
N = 100 # Số mẫu
t = np.arange(N)/fs #Tạo ra 100 mẫu với chu kỳ lấy mẫu là Ts = 1/fs
y = 3*np.sin(2*np.pi*f * t + np.pi/2) #Tính biên độ của sóng sin
plt.stem(t,y, 'r' )
plt.title("Tín hiệu hình sin")
plt.xlabel("Time[Samples (Mẫu)]")
plt.ylabel("Amplitude (Biên độ)")
Bài 3c: Thay thế câu lệnh vẽ bằng stem sang plot và step. Cho biết kết quả thu được
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 5/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
fs = 100 # Tốc độ lấy mẫu (Hz)
f = 1 # Tần số của tín hiệu
N = 100 # Số mẫu
t = np.arange(N)/fs #Tạo ra 100 mẫu với chu kỳ lấy mẫu là Ts = 1/fs
y = 3*np.sin(2*np.pi*f * t + np.pi/2) #Tính biên độ của sóng sin
plt.step(t, y, 'r' )
plt.title("Tín hiệu hình sin vẽ bằng lệnh step")
plt.xlabel("Time[Samples (Mẫu)]")
plt.ylabel("Amplitude (Biên độ)")
Bài 3d: Cho đoạn chương trình sau. Cho biết tần số, biên độ, pha ban đầu, và tần số lấy mẫu của tín hiệu y?
plt.stem(t, y, 'r' )
plt.title("Tín hiệu hình sin")
plt.xlabel("Time[Samples (Mẫu)]")
plt.ylabel("Amplitude (Biên độ)")
Bài 4a: Đoạn chương trính sau tạo tín hiệu tổng hợp từ 2 tín hiệu sin với tần số lần lượt là f1 = 10Hz và f2 = 1Hz
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 6/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
Bài 4b: Thay đổi biên độ tín hiệu s1 ở câu 4a sang 0.5. Vẽ lại tín hiệu và nhận xét
Bài 4c:
Thay đổi biên độ tín hiệu s2 ở câu 4a sang 0.5, biên độ s1 = 3. Vẽ lại tín hiệu và nhận xét
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 7/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
Bài 4d: Thực hiện tạo và vẽ tín hiệu tổng hợp sA = s1 + s2 từ 2 tín hiệu hình sin s1 và s2 với các thông số như sau:
s1: a1 = 5, f1 = 1KHz
s2: a2 = 1, f2 = 50Hz
Số mẫu: n = 1000
Tần số lấy mẫu: fs = 8000
Bài 4e:Thực hiện vẽ tín hiệu sB = s1*s2 với s1, s2 là các tín hiệu hình sin các thông số sau:
s1: a1 = 5, f1 = 1KHz
s2: a2 = 1, f2 = 50Hz
Số mẫu: n = 1000
Tần số lấy mẫu: fs = 8000
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 8/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
t = np.arange(1000)/8000
s1 = 5*np.sin(2*np.pi*1000*t)
s2 = np.sin(2*np.pi*50*t)
sB = s1*s2
plt.plot(t, sB)
plt.xlabel('Thời gian (s)')
plt.ylabel('Biên độ (V)')
Bài 4f: Vẽ lại tín hiệu s1, s2, sA và sB trên cùng hình vẽ sử dụng plt.subplot()
plt.subplot(4, 1, 1)
plt.plot(t, s1)
plt.subplot(4, 1, 2)
plt.plot(t, s2)
plt.subplot(4, 1, 3)
plt.plot(t, sA)
plt.subplot(4, 1, 4)
plt.plot(t, sB)
[<matplotlib.lines.Line2D at 0x236bd411890>]
Bài 5a:
Vẽ tín hiệu s(t) = cos(2πt) + cos(8πt) + cos(12πt) và tín hiệu sa(t) = 3 ∗ cos(2πt) trên cùng 1 hình với tần số fs = 5 Hz, số mẫu N =
100. So sánh tần số của s và sa?
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 9/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
fs = 10
N = 100
t = np.arange(N)/fs
#t = np.linspace(0, 20, 100, endpoint=Flase)
s = np.cos(2*np.pi*t) + np.cos(8*np.pi*t) + np.cos(12*np.pi*t)
sA = 3*np.cos(2*np.pi*t)
plt.subplot(2, 1, 1)
plt.plot(t, s)
plt.subplot(2, 1, 2)
plt.plot(t, sA)
[<matplotlib.lines.Line2D at 0x152ca4b2490>]
Bài 5b:
Thay đổi fs từ 5Hz lần lượt sang 10Hz và 50Hz. Vẽ lại tín hiệu s và sa. Nhận xét?
fs_list = [5, 10, 50] #tạo danh sách các tần số fs cần thử
N = 100
for i, fs in enumerate(fs_list, 1): #vòng lặp for để lặp qua mỗi giá trị fs tương ứng
t = np.arange(N) / fs
s = np.cos(2 * np.pi * t) + np.cos(8 * np.pi * t) + np.cos(12 * np.pi * t)
sA = 3 * np.cos(2 * np.pi * t)
plt.subplot(len(fs_list), 2, 2*i-1)
plt.plot(t, s, label=f's, fs={fs} Hz')
plt.xlabel('Thời gian (s)')
plt.ylabel('Biên độ')
plt.legend()
plt.grid(True)
plt.subplot(len(fs_list), 2, 2*i)
plt.plot(t, sA, label=f'sA, fs={fs} Hz', color='r')
plt.xlabel('Thời gian (s)')
plt.ylabel('Biên độ')
plt.legend()
plt.grid(True)
plt.tight_layout() #tự động điều chỉnh khoảng cách giữa các đồ thị để chúng không chồng lên nhau
plt.show() #hiển thị tất cả các đồ thị
#nhận xét: khi tăng tần số lấy mẫu fs, độ phân giải của tín hiệu theo thời gian tăng lên, cho phép ta quan sát chi tiết hơn các thành ph
#fs quá thấp có thể gây ra hiện tượng aliasing, làm cho các thành phần tần số cao giả mạo thành các tần số thấp hơn, làm biến
#điều kiện: fs>2fmax (nguyên tắc Nyquist) để tránh hiện tượng aliasing(giả mạo tín hiệu) và thu được tín hiệu chính xác.
#do fmax= 6 nên fs đề cử sẽ >12, khi đó ta sẽ thấy được sự khác nhau rõ rệt giữa các tín hiệu
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 10/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
Bài 6a:
Đoạn chương trình sau tạo và phát âm thanh sin thuần tần số 440Hz với fs = 44100Hz
0:00 / 0:01
Bài 6b:
Thay đổi tần số của tín hiệu bài 4a sang 392Hz (Note G4) và 523.25Hz (Note C5). Nhận xét
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 11/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab
import IPython.display as ipd #Thêm thư viện để play Audio
https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 12/12