ĐẠI HỌC QUỐC GIA TP.HCM - TRƯỜNG ĐẠI
HỌC BÁCH KHOA
Chương trình kỹ sư chất lượng cao Việt Pháp
BÁO CÁO BÀI TẬP LỚN
THU TRONG TRUYỀN THƠNG SỐ
PHÂN TÍCH SPECTROGRAM CỦA
TÍN HIỆU ÂM THANH
GVHD: PGS. TS Hà Hoàng Kha
Sinh viên thực hiện:
Võ Nguyễn Gia Luật – 1611944
Trương Thành Ý – 1614249
Nguyễn Tấn Thịnh – 1613358
TP. Hồ Chí Minh, ngày 01 tháng 12 năm 2020
MỤC LỤC
LỜI MỞ ĐẦU ................................................................................................................... 2
BẢNG PHÂN CHIA CÔNG VIỆC .................................................................................. 3
DANH MỤC HÌNH ẢNH ................................................................................................ 4
I. GIỚI THIỆU ĐỀ TÀI ................................................................................................... 5
1. Đặt vấn đề ................................................................................................................ 5
2. Nội dung thực hiện .................................................................................................. 5
II. TỔNG HỢP LÝ THUYẾT .......................................................................................... 5
1. Biến đổi Fourier của tín hiệu ................................................................................... 5
2. Hàm cửa sổ ............................................................................................................... 7
3. Spectrogram của tín hiệu ......................................................................................... 8
III. THU TÍN HIỆU ÂM THANH VÀ PHÂN TÍCH SPECTROGRAM ................. 10
1. Viết code Matlab .................................................................................................... 10
2. Viết code Python .................................................................................................... 13
3. Viết code C# ........................................................................................................... 15
VII. TỔNG KẾT ĐÁNH GIÁ ......................................................................................... 17
1. Ưu điểm .................................................................................................................. 17
2. Nhược điểm ............................................................................................................ 18
TÀI LIỆU THAM KHẢO .............................................................................................. 29
1
LỜI MỞ ĐẦU
Ngày nay, các kỹ thuật xử lý tín hiệu số dựa trên phân tích phổ đã trở thành
một công cụ quan trọng trong tất cả các lĩnh vực. Việc phân tích tính hiệu trong
các miền biểu diễn khác nhau như thời gian, tần số giúp chúng ta có cái nhìn đầy
đủ và trực quan về tín hiệu cần xử lý.
Đối với tín hiệu âm thanh nói riêng và các tín hiệu khác nói chung, sau khi
đã được số hóa thì việc quan sát phân tích phổ tín hiệu trong một khoảng thời
gian liên tục đóng vai trị quan trọng trong việc xử lý tín hiệu nhanh chóng cũng
như loại bỏ các nhiễu không mong muốn. Đồ thị Spectrogram là một giải pháp
hữu hiệu cho việc xử lý các tín hiệu số nói trên.
Để có thể hiểu rõ hơn về việc phân tích tín hiệu âm thanh cũng như tìm
hiểu sâu hơn về spectrogram, nhóm chúng em đã thực hiện tìm hiểu và mơ phỏng
đề tài “Phân tích Spectrogram của tín hiệu âm thanh” thơng qua việc viết chương
trình xử lý tín hiệu trên một số ngơn ngữ lập trình phổ biến như Matlab, Python
và C#.
Nhóm chúng em chân thành cảm ơn sự hỗ trợ và giảng dạy của thầy Hà Hoagnf
Kha đã đưa ra đề tài và hướng đi để thực hiện đề tài. Nhờ sự hướng dẫn của thầy, nhóm
đã hồn thành đề tài đúng hạn và đạt được các mục tiêu đề ra. Nhưng do thời gian có
hạn, cũng như kiến thức cịn nhiều hạn chế, nhóm chắc chắn khơng tránh khỏi những
thiếu sót. Nhóm chúng em rất mong nhận được sự góp ý từ thầy để bài báo cáo được
hồn thiện hơn.
TP. Hồ Chí Minh, ngày 13/7/2020
2
BẢNG PHÂN CHIA CƠNG VIỆC
STT
Sinh Viên
Cơng việc
- Đọc lại lý thuyết.
1
VÕ NGUYỄN GIA LUẬT
- Viết chương trình phân tích Spectrogram
dùng Python.
- Viết báo cáo
- Đọc lại lý thuyết.
2
NGUYỄN TẤN THỊNH
- Viết chương trình phân tích Spectrogram
dùng Matlab.
- Viết báo cáo
- Đọc lại lý thuyết.
3
TRƯƠNG THÀNH Ý
- Viết chương trình phân tích Spectrogram
dùng C#.
- Viết báo cáo.
3
DANH MỤC HÌNH ẢNH
Hình 1: Short time fourier transform ................................................................................... 7
Hình 2: Spectrogram dạng 3D và 2D .................................................................................. 9
Hình 3: Lưu đồ thu tín hiệu âm thanh trong matlab .......................................................... 11
Hình 4: Lưu đồ phân tích spectrogram trong matlab ........................................................ 11
Hình 5: Kết quả Spectrogram dùng code matlab............................................................... 12
Hình 6: Kết quả kiểm chứng Spectrogram với tần số 4 kHz và 6kHz .............................. 13
Hình 7: Lưu đồ phân tích spectrogram trong python ........................................................ 14
Hình 8: Kết quả spectrogram trong python ....................................................................... 14
Hình 9: Kết quả kiểm chứng spectrogram với tín hiệu 8 kHz và 12 kHz. ........................ 15
Hình 10: Lưu đồ phân tích spectrogram trong C# ............................................................. 16
Hình 11: Kết quả spectrogram trong C#............................................................................ 16
Hình 12: Kết quả kiểm chứng spectrogram với tín hiệu 2 kHz và 4 kHz. ........................ 17
4
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
GIỚI THIỆU ĐỀ TÀI
I.
1. Đặt vấn đề
-
Việc xử lý tín hiệu âm thanh có thể gặp phải các khó khăn bởi các nhiễu mơi
trường như nhiễu cơ học hay điện. Do đó, việc nhận dạng nhanh các tín hiệu
nhiễu, quan sát trực quan phổ tín hiệu theo thời gian là yêu cầu thiết thực cho
việc xử lý tín hiệu.
-
Xuất phát từ thực tế mn nắm vững lý thuyết về xử lý tín hiệu số dựa trên mơ
phỏng trên các phần mềm và tìm hiểu sâu hơn về Spectrogram, nhóm đã thực
hiên đề tài “Phân tích Spectrogram cho tín hiệu âm thanh”.
2. Mục tiêu về phạm vi đề tài
2.1.
-
Mục tiêu đề tài
Nắm lại kiến thức về các phép biến đổi quen thuộc, về khái niệm cửa sổ quan
sát.
-
Ơn lại kiến thức lập trình một số ngơn ngữ cơ bản.
-
Xây dụng được chương trình thu tín hiệu âm thanh và phân tích spectrogram
cho tín hiệu theo thời gian thực.
2.2. Nội dung thực hiện
-
Đọc lại kiến thức về các phép biến đổi, các khái niệm về hàm cửa sổ.
-
Tìm hiểu về spectrogram cho tín hiệu âm thanh.
-
Viết chương trình đọc tín hiệu âm thanh từ microphone và biến đổi
spectrogram theo thời gian thực.
CÁC KHÁI NIỆM CƠ BẢN
II.
1. Biến đổi Fourier của tín hiệu
-
Biến đổi Fourier của một tín hiệu liên tục khơng tuần hồn x(t) được định
nghĩa như sau:
x(t ) X ( F )
F
x(t )e
5
j 2Ft
dt
MƠ PHỎNG SPECTROGRAM
-
PGS.TS Hà Hồng Kha
Như vậy phép biến đổi Fourier đã chuyển việc biểu diễn tín hiệu khơng tuần hoàn x(t)
trong miền thời gian t thành việc biểu diễn tín hiêu X(F) trong miền tần số f. Việc sử
dụng phép biến đổi Fourier để chuyển đổi miền thời gian, tần số giúp chúng ta có cái
nhìn tổng quan hơn về tín hiệu.
1.1. DTFT (Discrete-Time Fourier Transform)
-
Là phép biến đổi Fourier cho tín hiệu rời rạc theo miền thời gian nhằm biến nó thành
tín hiệu liên tục trong miền tần số.
+∞
̂ ) = ∑ 𝒙[𝒏]𝒆−𝒋𝝎̂𝒏
𝑿 (𝝎
𝒏=−∞
Với x[n] = x(n𝑇𝑠 ) và 𝜔
̂ = 2𝜋𝐹/𝐹𝑠
1.2. DFT (Discrete Fourier Transform)
-
Bằng cách “lấy mẫu” DTFT ở N tần số rời rạc 𝜔𝑘 = 2𝜋𝑘/𝑁, ta được DFT, là
tín hiệu vừa rời rạc trong miền thời gian vừa rời rạc theo miền tần số:
𝑵−𝟏
𝟐𝝅
𝑿[𝒌] = ∑ 𝒙[𝒏]𝒆−𝒋 𝑵 𝒌𝒏
𝒏=𝟎
1.3. FFT (Fast Fourier Transform)
-
Là thuật tốn để tính nhanh DFT của một chuỗi. Có nhiều loại thuật toán FFT
khác nhau sử dụng các kiến thức từ nhiều mảng khác nhau. Một số thuật toán
phổ biến như: Cooley – Tukey, thừa số nguyên tố (thuật toán Good –
Thomas),…
1.4. STFT (Short Time Fourier Transform)
-
Để tính tốn DFT cho tín hiệu thực, ta có thể chia tín hiệu theo thời gian thành
từng khối và tính DFT cho từng khối đó, gọi là biến đổi STFT.
-
Cơng thức:
∞
𝑋 (𝑛, 𝜔) = ∑ 𝑥 [𝑚]𝑤[𝑛 − 𝑚]𝑒 −𝑗𝜔𝑚
𝑚=−∞
-
Với 𝑥 [𝑚]𝑤[𝑛 − 𝑚] là 1 phần thời gian ngắn của tín hiệu tiếng nói.
6
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
Hình 1: Short time fourier transform
-
Tính tốn STFT dựa trên thuật tốn FFT: Dựa trên giải thuật FFT, biến đổi STFT có
thể được tính tốn nhanh hơn.
2. Hàm cửa sổ
2.1. Khái niệm về hàm cửa sổ
-
Trong xử lý tín hiệu, hàm cửa sổ là một hàm tốn học có giá trị bằng khơng
bên ngồi một số khoảng đã chọn. Về mặt toán học, khi một hàm hoặc dạng
sóng, chuỗi dữ liệu khác được nhân với một hàm cửa sổ, kết quả cũng có giá trị
bằng khơng bên ngồi khoảng cửa sổ.
-
Khi quan sát một tín hiệu ở miền tần số hoặc thời gian, người ta chỉ quan tâm
đến một số khoảng nhất định mà không quan tâm hết tồn miền tín hiệu vơ
hạn. Do đó, tùy vào mục đích mà tín hiệu chỉ được quan sát trong một khoảng
thời gian hay tần số hữu hạn. Khi đó ứng với việc nhân tín hiệu đã cho với hàm
cửa sổ.
2.2. Một số hàm cửa sổ phổ biến
-
Hàm cửa sổ chữ nhật:
-
Hàm cửa sổ Hanning:
7
MÔ PHỎNG SPECTROGRAM
-
Hàm cửa sổ Hamming:
-
Hàm cửa sổ Blackman:
-
Hàm cửa sổ Barlett:
PGS.TS Hà Hồng Kha
3. Spectrogram của tín hiệu
3.1. Giới thiệu về spectrogram
-
Spectrogram (ảnh phổ) là một đồ thị mô tả trực quang phổ tần số của một tín
hiệu thay đổi theo thời gian.
-
Khi áp dụng phân tích spectrogram cho tín hiệu âm thanh, spectrogram đơi khi
cịn được gọi sonographs, voiceprints hoặc voicegrams. Khi dữ liệu
spectrogram được biểu diễn dưới dạng biểu đồ 3D, chúng còn được gọi là
waterfall .
8
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
Hình 2: Spectrogram dạng 3D và 2D
-
Dạng phổ biến của spectrogram là biểu đồ ở dạng 2D gồm hai trục: một trục
biểu thị thời gian và trục còn lại biểu thị tần số. Chiều thứ ba cho biết biên độ
của một tần số cụ thể tại một thời điểm cụ thể được biểu thị bằng cường độ
hoặc màu sắc của mỗi điểm trong ảnh. Trục tần số và biên độ có thể theo thang
tuyến tính hoặc logarit tùy thuộc vào mục đích sử dụng. Đối với tín hiệu âm
thanh, trục biên độ thường sẽ được biểu diễn bằng thang logarit.
-
Spectrogram có thể được tạo ra từ tín hiệu trong miền thời gian theo một trong
hai cách: từ một chuỗi các bộ lọc thông dãi nối tiếp nhau (đây là cách thường
dùng trước khi các kỹ thuật xử lý tín hiệu số hiện đại ra đời) hoặc sử dụng phép
biến đổi Fourier để chuyển tín hiệu từ miền thời gian sang miền tần số. Hai
phương pháp này tạo thành hai biểu diễn thời gian – tần số khác nhau, nhưng
tương đương nhau trong một số điều kiện.
+ Phương pháp sử dụng một chuỗi các bộ lọc thông dải được sử dụng xử lý
tương tự để chia tín hiệu đầu vào thành các dải tần, độ lớn của mỗi đầu ra của
bộ lọc điều khiển một đầu dị ghi lại ảnh phổ dưới dạng hình ảnh trên giấy.
+ Phương pháp tạo spectrogram bằng FFT là một quá trình xử lý tín hiệu số.
Dữ liệu được lấy mẫu và số hóa trong miền thời gian, được chia thành nhiều
khối có độ dài bằng nhau thường chồng lấn lên nhau và sử dụng biến đổi
Fourier để tính tốn độ lớn của phổ tần số cho mỗi khối. Các phổ này sau đó
9
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
được đặt cạnh nhau hoặc hơi chồng lên nhau theo các bước dịch chuyển của
cửa sổ quan sát để tạo thành hình ảnh chuỗi vạch phổ liên tục hoặc chuyển
sang bề mặt 3D. Quá trình này về cơ bản tương ứng với việc tính tốn độ lớn
bình phương của biến đổi Fourier thời gian ngắn (STFT) của tín hiệu s(t) với
độ rộng của sổ quan sát là L:
𝑆𝑝𝑒𝑐𝑡𝑟𝑜𝑔𝑟𝑎𝑚 (𝑡, 𝐿) = |𝑆𝑇𝐹𝑇(𝑡, 𝐿)|2
3.2. Ứng dụng:
-
Spectrogram là một tập hợp các phân tích tần số theo thời gian, nên nó có thể
được sử dụng để xác định các đặc điểm của tín hiệu phi tuyến hoặc phi tuyến.
Vì lý do này, spectrogram là một cơng cụ hữu ích để phân tích dữ liệu trong
thế giới thực nơi có các thành phần tần số khác nhau và các loại nhiễu xen vào
như nhiễu cơ học, nhiễu điện.
-
Spectrogram rất hữu ích cho việc phân tích các dao động trên một mơi trường
thay đổi. Nó minh họa các dạng thay đổi năng lượng có thể khơng nhìn thấy
trong FFT hoặc PSD (Power Spectral Density). So với FFT, spectrogram cho
ta cái nhìn rõ hơn về sự thay đổi của các dao động theo thời gian.
-
Trong lĩnh vực xử lý âm thanh, spectrogram có thể mơ tả trực quan tín hiệu
trong dải tần rộng và dễ dàng quan sát các nhiễu trong xử lý âm thanh. Từ đó,
có thể dễ dàng nhận biết các thành phần nhiễu cũng như tìm ra cách loại bỏ âm
thanh nhiễu đó một cách nhanh chóng.
III.
THU TÍN HIỆU ÂM THANH VÀ PHÂN TÍCH SPECTROGRAM
1. Viết code matlab
Các thông số :
- Tốc độ lấy mẫu : 44100 Hz (được lựa chọn theo mặc định của matlab, lớn gấp
hai lần tần số âm thanh có thể nghe được).
- Số mẫu trong một frame : 1024 (theo mặc định của matlab).
- Số frame trong một Stack :10.
- Sử dụng giải thuật FFT với L=1024.
10
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
1.1. Sơ đồ khối:
a) Lưu đồ thu tín hiệu trong matlab
Hình 3: Lưu đồ thu tín hiệu âm thanh trong matlab
Cấu hình
Các thuộc tính của audioDeviceReader bao gồm việc chỉ định trình điều
khiển, thiết bị (card âm thanh), lựa chọn tốc độ lấy mẫu, độ sâu bit, kích
thước bộ đệm. Đối với thu âm, tốc độ lấy mẫu mặc định là 44100 Hz.
Vòng lặp xử lý thời gian thực
Micrô thu âm thanh và gửi tín hiệu điện liên tục đến card âm thanh.
Card âm thanh thực hiện chuyển đổi từ tương tự sang số với tốc độ lấy
mẫu, kích thước bộ đệm và độ sâu bit được chỉ định trong quá trình cấu
hình.
Bộ chuyển đổi tương tự-kỹ thuật số ghi các mẫu âm thanh vào bộ đệm
của card âm thanh. Nếu bộ đệm đầy, các mẫu cũ sẽ bị loại bỏ.
b) Lưu đồ giải thuật xử lý.
Hình 4: Lưu đồ phân tích spectrogram trong matlab
11
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
1.2. Kết quả:
Hình 5: Kết quả Spectrogram dùng code matlab
-
Nhận xét: Năng lượng của âm thanh thông thường chủ yếu tập trung ở các tần
số thấp dưới 4kHz. Đây là lý do hệ thống truyền thanh của GSM được lấy mẫu
ở tần số 8kHz.
1.3. Kiểm chứng:
-
Sử dụng phần mềm Tone Generator để phát hai tín hiệu đơn tần số 4 kHz và 6 kHz.
Kết quả thu được hai vạch phổ theo thời gian trên spectrogram.
12
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
Hình 6: Kết quả kiểm chứng Spectrogram với tần số 4 kHz và 6kHz.
2. Viết code Python
-
Viết chương trình ghi âm tín hiệu từ microphone và lấy mẫu tín hiệu với tần số lấy
mẫu 44100 Hz sử dụng hàm PyAudio trong thư viện pyaudio của python.
-
Viết chương trình biến đổi FFT cho chuỗi tín hiệu thu được với mỗi cửa sổ Hanning.
Khi cửa sổ trượt theo thời gian thì tiến hành thực hiện FFT tín hệu thu được sử dụng
hàm specgram trong thư viện matplotlib.mlab. Khi đã chứa đủ 5 phổ tín hiệu thì bắt
đầu xóa bỏ tín hiệu cũ ra khỏi cửa sổ quan sát để tín hiệu tiếp theo đi vào, tạo nên sự
di chuyển liên tục của phổ theo chiều trượt của cửa sổ.
-
Các thông số :
Tốc độ lấy mẫu : 44100 Hz (Lớn gấp hai lần tần số âm thanh có thể nghe được).
Số mẫu trong một frame : 8192.
Số frame trong một Stack :5.
Sử dụng giải thuật FFT với L=1024.
13
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
2.1. Sơ đồ khối:
Thu tín hiệu
và lấy mẫu
Dịch chuyển
cửa sổ
Thực hiên
FFT
Lưu đè và
cập nhật phổ
Hiển thị
Hình 7: Lưu đồ phân tích spectrogram trong python
2.2. Kết quả:
Hình 8: Kết quả spectrogram trong python
14
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
2.3. Kiểm chứng:
-
Sử dụng phần mềm Tone Generator để phát hai tín hiệu đơn tần số 8 kHz và 12 kHz.
Kết quả thu được hai vạch phổ theo thời gian trên spectrogram.
Hình 9: Kết quả kiểm chứng spectrogram với tín hiệu 8 kHz và 12 kHz.
3. Viết code C#
- Các thông số :
Tốc độ lấy mẫu : 44000 Hz (Lớn gấp hai lần tần số âm thanh có thể nghe được).
Số frame trong một Stack :51.
Sử dụng giải thuật FFT với L=2048.
15
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
3.1. Sơ đồ khối:
Thu tín hiệu
và lấy mẫu
Nhân tín hiệu
với hàm của
sổ Hanning
Lưu đè và
cập nhật phổ
Thực hiên
FFT tín hiệu
Sử dụng thư viện
Spectrogram để vẽ
phổ
Hình 10: Lưu đồ phân tích spectrogram trong C#
3.2. Kết quả:
Hình 11: Kết quả spectrogram trong C#
16
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
3.3. Kiểm chứng:
-
Sử dụng phần mềm Tone Generator để phát hai tín hiệu đơn tần số 2 kHz và 4 kHz.
Kết quả thu được hai vạch phổ theo thời gian trên spectrogram.
Hình 12: Kết quả kiểm chứng spectrogram với tín hiệu 2 kHz và 4 kHz.
TỔNG KẾT ĐÁNH GIÁ
IV.
1. Ưu điểm
-
Nhóm đã cố gắng tìm hiểu Spectrogram và ôn lại kiến thức về các phép biến đổi sử
dụng trong xử lý số tín hiệu.
-
Hồn thành việc viết chương trình lưu âm thanh và phân tích spectrogram theo thời
gian thực
17
MƠ PHỎNG SPECTROGRAM
-
PGS.TS Hà Hồng Kha
Kiểm nghiệm lại với tín hiệu đơn tần số cho kết quả đúng với lý thuyết.
2. Nhược điểm
-
Chương trình cịn thơ sơ, chưa đầy đủ chức năng như thay đổi view nhìn 3D, giao
diện người dừng,…
-
Chưa kiểm chứng độ chính xác về mặt biên độ của tín hiệu.
18
MƠ PHỎNG SPECTROGRAM
-
PGS.TS Hà Hồng Kha
Code python:
+ Chương trình microphone.py
import pyaudio
import numpy as np
RATE = 44100
FORMAT = pyaudio.paInt16 #conversion format for PyAudio stream
CHANNELS = 1 #microphone audio channels
CHUNK_SIZE = 8192 #number of samples to take per read
SAMPLE_LENGTH = int(CHUNK_SIZE*1000/RATE) #length of each sample in
ms
def open_mic():
pa = pyaudio.PyAudio()
stream = pa.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
frames_per_buffer = CHUNK_SIZE)
return stream,pa
def get_data(stream,pa):
input_data = stream.read(CHUNK_SIZE)
data = np.fromstring(input_data,np.int16)
return data
+ Chương trình Spectrogram.py
from matplotlib.mlab import window_hanning,specgram,window_none
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.colors import LogNorm
import numpy as np
import microphone
19
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
SAMPLES_PER_FRAME = 5 #Number of mic reads concatenated within a single
window
nfft = 1024 #NFFT value for spectrogram
overlap = 1000 #overlap value for spectrogram
rate = microphone.RATE #sampling rate
def get_specgram(signal,rate):
arr2D,freqs,bins = specgram(signal, window = window_hanning,
Fs = rate,NFFT=nfft,noverlap=overlap)
return arr2D,freqs,bins
def update_fig(n):
data = microphone.get_data(stream,pa)
arr2D,freqs,bins = get_specgram(data,rate)
im_data = im.get_array()
if n < SAMPLES_PER_FRAME:
im_data = np.hstack((im_data,arr2D))
im.set_array(im_data)
else:
keep_block = arr2D.shape[1]*(SAMPLES_PER_FRAME - 1)
im_data = np.delete(im_data,np.s_[:-keep_block],1)
im_data = np.hstack((im_data,arr2D))
im.set_array(im_data)
return im
global stream
fig = plt.figure()
stream,pa = microphone.open_mic()
data = microphone.get_data(stream,pa)
arr2D,freqs,bins = get_specgram(data,rate)
extent = (bins[0],bins[-1]*SAMPLES_PER_FRAME,freqs[-1],freqs[0])
im = plt.imshow(arr2D,aspect='auto',extent = extent,interpolation="none",
cmap = 'jet',norm = LogNorm())
20
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
plt.colorbar()
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.title('Spectrogram')
plt.gca().invert_yaxis()
anim = animation.FuncAnimation(fig,update_fig,blit = False,
interval=microphone.CHUNK_SIZE/1000)
try:
plt.show()
except:
print("Plot Closed")
stream.stop_stream()
stream.close()
pa.terminate()
print("Program Terminated")
-
Code Matlab:
clear
%%Thiet lap cac thong so
fs = 44100; % toc do lay mau
spf = 1024; % so mau trong mot frame
fps = 10; % so frame trong mot stack
f_range = (0:(spf-1))*fs/spf;
stack = zeros(fps, spf);
x = 1:fps;
[Y, X] = meshgrid(f_range, x);
%% Thu tin hieu
deviceReader = audioDeviceReader(fs, spf);
while(1)
amthanh = deviceReader();
21
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
FFT = fft(amthanh);
FFT_abs = abs(FFT); % Tin 1024-FFT cua frame
% Day cac frame trong stack
stack(1:fps - 1,:) = stack(2:fps,:);
stack(fps,:) = FFT_abs(:);
% Ve spectrogram
surf(X, Y, stack)
xlim([1 fps])
ylim([0 20000])
ylabel('Freq')
zlim([0 4])
colorbar
caxis([0 1])
shading interp;
view(2)
GF1 = getframe;
end
-
Code C#:
+ Chương trình FormMicrophone.cs
sing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
22
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
namespace Spectrogram.MicrophoneDemo
{
public partial class FormMicrophone : Form
{
Colormap[] cmaps;
public FormMicrophone()
{
InitializeComponent();
if (NAudio.Wave.WaveIn.DeviceCount == 0)
{
MessageBox.Show("No audio input devices found.\n\nThis program will
now exit.",
"ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
Close();
}
else
{
cbDevice.Items.Clear();
for (int i = 0; i < NAudio.Wave.WaveIn.DeviceCount; i++)
cbDevice.Items.Add(NAudio.Wave.WaveIn.GetCapabilities(i).ProductName);
cbDevice.SelectedIndex = 0;
}
for (int i = 9; i < 16; i++)
cbFftSize.Items.Add($"2^{i} ({1 << i:N0})");
cbFftSize.SelectedIndex = 1;
cmaps = Colormap.GetColormaps();
foreach (Colormap cmap in cmaps)
cbColormap.Items.Add(cmap.Name);
cbColormap.SelectedIndex = cbColormap.Items.IndexOf("Viridis");
}
23
MƠ PHỎNG SPECTROGRAM
PGS.TS Hà Hồng Kha
private void Form1_Load(object sender, EventArgs e) { }
private void cbDevice_SelectedIndexChanged(object sender, EventArgs e) =>
StartListening();
private void cbFftSize_SelectedIndexChanged(object sender, EventArgs e) =>
StartListening();
private Spectrogram spec;
private Listener listener;
private void StartListening()
{
int sampleRate = 44000;
int fftSize = 1 << (9 + cbFftSize.SelectedIndex);
int stepSize = fftSize / 20;
pbSpectrogram.Image?.Dispose();
pbSpectrogram.Image = null;
listener?.Dispose();
listener = new Listener(cbDevice.SelectedIndex, sampleRate);
spec = new Spectrogram(sampleRate, fftSize, stepSize, 0, 15000);
//spec.SetWindow(FftSharp.Window.Rectangular(fftSize));
pbSpectrogram.Height = spec.Height;
pbScaleVert.Image?.Dispose();
pbScaleVert.Image = spec.GetVerticalScale(pbScaleVert.Width);
pbScaleVert.Height = spec.Height;
}
private void timer1_Tick(object sender, EventArgs e)
{
double[] newAudio = listener.GetNewAudio();
spec.Add(newAudio, process: false);
double multiplier = tbBrightness.Value / 20.0;
24