Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

19:50 31/05/2024 DSP_2024_Lab1_22207053.

ipynb - Colab

keyboard_arrow_down Khoa Điện tử Viễn thông- Trường Đại học Khoa học tự nhiên

Bài 1: TÍN HIỆU TRONG MIỀN THỜI GIAN

Nhóm: 7 (ca 12h55-14h55)


Họ và tên: Phạm Văn Ký
MSSV: 22207053

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.

Thư viện hỗ trợ cho xử lý tín hiệu số trong Python:


-numpy: Giúp xử lý số học hoặc mảng
-matplotlib: Hỗ trợ vẽ tín hiệu
-scipy: Thư viện hỗ trợ xử lý tín hiệu số
Để sử dụng các thư viện này ta phải import trước khi sử dụng các hàm tương ứng

#import thư viện cho toàn bài lab


#Chạy đoạn lệnh này khi mở file để thêm thư viện cho toàn bộ project
import matplotlib.pyplot as plt
from scipy import signal
import numpy as np

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 độ)")

Text(0, 0.5, '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 độ)")

Text(0, 0.5, '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 độ)")

Text(0, 0.5, 'Amplitude (Biên độ)')

Bậc đơn vị u(n) có công thức:


1, n ≥ 0
u(n) = {
0, n < 0

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 độ)")

Text(0, 0.5, 'Amplitude (Biên độ)')

Bài 1e: Ví dụ về bậc đơn vị u(n) 10 mẫu

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 độ)")

Text(0,0.5,'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)

<StemContainer object of 3 artists>

Bài 2a: Tạo sóng vuông từ signal.square()

from scipy import signal


import matplotlib.pyplot as plt
t = np.linspace(0, 1, 500, endpoint=False) #Tạo 1 dải tuyến tính từ 0 -> 1, số mẫu là 500, không lấy mẫu cuối cùng
s = signal.square(2 * np.pi * 5 * t, duty = 0.5) #Tạo sóng vuông tần số 5Hz, với tần số lấy mẫu là 500Hz
plt.plot(t, s)
plt.ylim(-2, 2) #Giới hạn trục y từ -2 đến 2

(-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

fs = 100 # Tốc độ lấy mẫu (Hz)


f = 2 # 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 = 2*np.sin(2*np.pi*f * t) #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 độ)")

Text(0, 0.5, '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 độ)")

Text(0, 0.5, '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

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.plot(t,y, 'r' )
plt.title("Tín hiệu hình sin vẽ bằng lệnh plot")
plt.xlabel("Time[Samples (Mẫu)]")
plt.ylabel("Amplitude (Biên độ)")

Text(0, 0.5, 'Amplitude (Biên độ)')

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 độ)")

Text(0, 0.5, '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?

t = np.linspace(0, 1, 20, endpoint=False) # tần số lấy mẫu fx=20hz


y = np.sin(3*np.pi*t+np.pi/6) #A=1, f = 1.5hz, pha = pi/6

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 độ)")

Text(0,0.5,'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

t = 4 #Thời gian của tín hiệu


fs = 100
n = np.linspace(0, t, fs*t, endpoint=False)
f1 = 10
f2 = 1
a1 = 3
a2 = 3
s1 = a1*np.sin(2*np.pi*f1*n)
s2 = a2*np.sin(2*np.pi*f2*n)
s = s1+s2 # Cộng 2 tín hiệu
plt.plot(n, s)
plt.xlabel('Thời gian (s)')
plt.ylabel('Biên độ (V)')
#plt.xlim(0, 2)

https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 6/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab

Text(0, 0.5, 'Biên độ (V)')

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

t = 4 #Thời gian của tín hiệu


fs = 100
n = np.linspace(0, t, fs*t, endpoint=False)
f1 = 10
f2 = 1
a1 = 0.5 #nhận xét: do tín hiệu s1 có biên độ nhỏ hơn tín hiệu s2 nên giờ đây s1 được xem như nhiễu của tính hiệu sau khi tổng hợp
a2 = 3
s1 = a1*np.sin(2*np.pi*f1*n)
s2 = a2*np.sin(2*np.pi*f2*n)
s = s1+s2 # Cộng 2 tín hiệu
plt.plot(n, s)
plt.xlabel('Thời gian (s)')
plt.ylabel('Biên độ (V)')
#plt.xlim(0, 2)

Text(0, 0.5, 'Biên độ (V)')

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

t = 4 #Thời gian của tín hiệu


fs = 100
n = np.linspace(0, t, fs*t, endpoint=False)
f1 = 10
f2 = 1
a1 = 3
a2 = 0.5 #nhận xét: do tín hiệu s2 có biên độ nhỏ hơn tín hiệu s1 nên giờ đây s2 được xem như nhiễu của tính hiệu sau khi tổng hợp
s1 = a1*np.sin(2*np.pi*f1*n)
s2 = a2*np.sin(2*np.pi*f2*n)
s = s1+s2 # Cộng 2 tín hiệu
plt.plot(n, s)
plt.xlabel('Thời gian (s)')
plt.ylabel('Biên độ (V)')
#plt.xlim(0, 2)

https://colab.research.google.com/drive/1OeqBNaZWgOmHMIhendKq2D4YRW1seDk5#scrollTo=xPtJpZhyXYnK&printMode=true 7/12
19:50 31/05/2024 DSP_2024_Lab1_22207053.ipynb - Colab

Text(0, 0.5, 'Biên độ (V)')

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

t = 1/8 #Thời gian của tín hiệu


fs = 8000
n = np.linspace(0, t, int (fs*t), endpoint=False)
f1 = 1000
f2 = 50
a1 = 5
a2 = 1
s1 = a1*np.sin(2*np.pi*f1*n)
s2 = a2*np.sin(2*np.pi*f2*n)
sA = s1+s2 # Cộng 2 tín hiệu
plt.plot(n, sA)
plt.xlabel('Thời gian (s)')
plt.ylabel('Biên độ (V)')
#plt.xlim(0, 2)

Text(0, 0.5, 'Biên độ (V)')

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)')

Text(0, 0.5, '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

plt.figure(figsize=(12, 9)) #tạo hình với độ rộng 12inch và cao 9inch

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

import IPython.display as ipd #Thêm thư viện để display Audio


from scipy.io import wavfile #Để tạo file wav
fs = 44100 # tần số lấy mẫu
t = 1.5 # thời gian của âm thanh
f = 440 # Tần số của tín hiệu (note A4)
n = np.linspace(0, t, int(t*fs), endpoint=False) # tạo biến thời gian rời rạc
x = np.sin(2*np.pi*f*n) # tạo sóng sin 440 Hz
ipd.Audio(x, rate=fs)
#Tạo file wav
#Tạo âm thanh PCM 16 bit
#x2 = np.iinfo(np.int16).max*x #Nhân biên độ với giá trị lớn nhất của số 16bit
#x_wav = np.array(x, dtype='int16') #Định dạng lại âm thanh 16 bit
#wavfile.write("sinAudio.wav", fs,x_wav)

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

You might also like