Chương 2 Nghiên cứu tổng quan2.1 Biến đổi Fourier là gì 2.1.1 Khái niệm Biến đổi Fourier hay chuyển hóa Fourier, được đặt tên theo nhà toán học ngườiPháp Joseph Fourier, là phép biến đổi
Trang 1ĐẠI HỌC ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
ĐỒ ÁN CHUYÊN NGÀNH
ĐỀ TÀI: AUDIO VISUALIZER
Sinh viên thực hiện : PHAN TRẦN HÙNG
NGUYỄN NGỌC HÀ GIANG
Giảng viên hướng dẫn : HÀ THỊ MINH PHƯƠNG
Lớp : 17IT1
Đà nẵng, tháng 12 năm 2020
Trang 2ĐẠI HỌC ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
ĐỒ ÁN CHUYÊN NGÀNH
AUDIO VISUALIZER
Đà Nẵng, tháng 12 năm 2020
Trang 3MỞ ĐẦU
Ngày nay khoa học kỹ thuật trên thế giới nói chung, ở Việt Nam nói riêng đangtrên đà phát triển mạnh mẽ và không ngừng nâng cao phát triển về mọi mặt Đặcbiệt là ngành công nghệ thông tin Để đáp ứng nhu cầu ngày càng cao của conngười thì hàng loạt các công ty về máy tính được ra đời và các ứng dụng côngnghệ thông tin đang được áp dụng ngày một nhều hơn.Với công nghệ hiện đạinhư ngày nay thì con người dần dần được giải phóng bởi những công việc nặngnhọc và thay vào đó là những ứng dụng của công nghệ thông tin ngày một hiệnđại và kỹ xảo như các robot, máy tự động Đặc biệt là trong lĩnh vực giải trí, nhucầu giải trí của con người này càng cao Đòi hỏi những phần mềm phục vụ giải tríđộc đáo hơn Audio Visualizer là một ứng dụng cho phép nghe nhạc và biểu diễnquang phổ một cách sinh động, phục vụ nhu cầu giải trí của con người
Trang 4
LỜI CẢM ƠN
Để hoàn thành chuyên đề báo cáo thực tập này trước tiên em xin gửi đến cô HàThị Minh Phương lời cảm ơn chân thành và sâu sắc nhất
Vì kiến thức bản thân còn hạn chế, trong quá trình nghiên cứu, hoàn thiện chuyên
đề này em không tránh khỏi những sai sót, kính mong nhận được những ý kiếnđóng góp từ cô
Em xin chân thành cảm ơn
Trang 5NHẬN XÉT (Của giảng viên hướng dẫn)
………
………
………
………
………
………
…… ………
………
………
………
………
……… ………
………
………
………
…… ………
………
………
………
………
……… ………
………
………
………
…… ………
………
………
………
………
………
Trang 7
MỤC LỤC Trang MỞ ĐẦU 1
Chương 1 Giới thiệu 10
1.1 Tổng quan 10
1.1.1 Audio visualizes là gì 10
1.1.2 Bối cảnh thực hiện đề tài 11
1.1.3 Vấn đề cần giải quyết 12
1.2 Phương pháp, kết quả 12
1.2.1 Phương pháp 12
1.2.2 Kết quả 12
Chương 2 Nghiên cứu tổng quan 13
2.1 Biến đổi Fourier là gì 13
2.1.1 Khái niệm 13
2.1.2 Ứng dụng 13
2.2 Công nghệ sử dụng 13
2.2.1 Python là gì 13
2.2.2 Thư viện Numpy 14
2.3 Mô hình, các bước thực hiện 15
2.4 Thiết kế chi tiết 15
Chương 3 Triển khai xây dựng 16
Chương 4 Kết luận và Hướng phát triển 17
PHỤ LỤC 121
DANH MỤC TÀI LIỆU THAM KHẢO 130
Trang 8DANH MỤC HÌNH
Trang
Hình 1.1: Một số loại máy phân tích phổ 1
Hình 1.2: Biểu diễn specrum của âm thanh dưới dạng đường thẳng 2
Hình 1.3: Biểu diễn specrum của âm thanh dưới dạng hình tròn 2
Hình 1.4: Biểu diễn specrum của âm thanh dưới dạng sóng 3D 2
Hình 1.5: Hình ảnh minh họa cho kết quả thực hiện 3
Hình 1.6: Spectrum của một tập tin âm thanh 3
Trang 10Chương 1 Giới thiệu
Máy đo độ rung
Máy đo tiếng ồn
Máy hiện sóng
Máy kiểm tra an toàn thiết bị điện,
Hình 1.1: Một số loại máy phân tích phổ
- Lĩnh vực giải trí
Audio visualizer và một số biến thể khác
1
Trang 11Hình 1.2: Biểu diễn specrum của âm thanh dưới dạng đường thẳng
Hình 1.3: Biểu diễn specrum của âm thanh dưới dạng hình tròn
Hình 1.4: Biểu diễn specrum của âm thanh dưới dạng sóng 3D 1.1.2 Bối cảnh thực hiện đề tài
Nhận thấy những kiến thức về lĩnh vực tín hiệu số là quan trọng trong quá trìnhhọc nên nhóm em đã chọn ra một đề tài để thực hiện nhằm mục đích nghiên cứu
và học tập, nâng cao trình độ bản thân
2
Trang 12- Ứng dụng được viết bằng Python
- Nhận đầu vào là một tập tin audio và xuất ra màn hình Spectrum của tập tin âm thanh đó
Hình 1.6: Spectrum của một tập tin âm thanh
3
Trang 13Chương 2 Nghiên cứu tổng quan
2.1 Biến đổi Fourier là gì
2.1.1 Khái niệm
Biến đổi Fourier hay chuyển hóa Fourier, được đặt tên theo nhà toán học ngườiPháp Joseph Fourier, là phép biến đổi một hàm số hoặc một tín hiệu theo miềnthời gian sang miền tần số Chẳng hạn như một bản nhạc có thể được phân tíchdựa trên tần số của nó
2.1.2 Ứng dụng
Biến đổi Fourier có rất nhiều ứng dụng khoa học, ví dụ như trong vật lý, số học,
xử lý tín hiệu, xác suất, thống kê, mật mã, âm học, hải dương học, quang học,hình học và rất nhiều lĩnh vực khác Trong xử lý tín hiệu và các ngành liên quan,biến đổi Fourier thường được nghĩ đến như sự chuyển đổi tín hiệu thành cácthành phần biên độ và tần số Sự ứng dụng rộng rãi của biến đổi Fourier bắtnguồn từ những tính chất hữu dụng của biến đổi này:
do đó những thành phần tần số khác nhau có thể được tính toán một cáchđộc lập
Theo định lý tích tổng chập, biến đổi Fourier chuyển một tích tổng chậpphức tạp thành một tích đại số đơn giản
Biến đổi Fourier rời rạc có thể được tính toán một cách nhanh chóng bằngmáy tính nhờ thuật toán FFT (fast Fourier transform)
Theo định lý Parseval-Plancherel, năng lượng của tín hiệu (tích phân củabình phương giá trị tuyệt đối của hàm) không đổi sau biến đổi Fourier
2.2 Công nghệ sử dụng
Ngoài việc xây dựng ứng dụng, trong quá trình phát triển đòi hỏi thêm các yếu tốgiúp đẩy nhanh quá trình phát triển, mã nguồn ngắn gọn,rõ ràng và có hỗ trợnhiều thư viện toán học nâng cao
Vì vậy nhóm quyết định sử dụng Python cho việc phát triển
2.2.1 Python là gì
Python là ngôn ngữ lập trình hướng đối tượng, cấp cao, mạnh mẽ, được tạo ra bởiGuido van Rossum Nó dễ dàng để tìm hiểu và đang nổi lên như một trong nhữngngôn ngữ lập trình nhập môn tốt nhất cho người lần đầu tiếp xúc với ngôn ngữlập trình Python hoàn toàn tạo kiểu động và sử dụng cơ chế cấp phát bộ nhớ tựđộng Python có cấu trúc dữ liệu cấp cao mạnh mẽ và cách tiếp cận đơn giảnnhưng hiệu quả đối với lập trình hướng đối tượng Cú pháp lệnh của Python là
4
Trang 14điểm cộng vô cùng lớn vì sự rõ ràng, dễ hiểu và cách gõ linh động làm cho nónhanh chóng trở thành một ngôn ngữ lý tưởng để viết script và phát triển ứngdụng trong nhiều lĩnh vực, ở hầu hết các nền tảng.
Tính năng chính của Python
Ngôn ngữ lập trình đơn giản, dễ học: Python có cú pháp rất đơn giản, rõ ràng Nó
dễ đọc và viết hơn rất nhiều khi so sánh với những ngôn ngữ lập trình khác nhưC++, Java, C# Python làm cho việc lập trình trở nên thú vị, cho phép bạn tậptrung vào những giải pháp chứ không phải cú pháp
Miễn phí, mã nguồn mở: Bạn có thể tự do sử dụng và phân phối Python, thậm chí
là dùng nó cho mục đích thương mại Vì là mã nguồn mở, bạn không những cóthể sử dụng các phần mềm, chương trình được viết trong Python mà còn có thểthay đổi mã nguồn của nó Python có một cộng đồng rộng lớn, không ngừng cảithiện nó mỗi lần cập nhật
Khả năng di chuyển: Các chương trình Python có thể di chuyển từ nền tảng nàysang nền tảng khác và chạy nó mà không có bất kỳ thay đổi nào Nó chạy liềnmạch trên hầu hết tất cả các nền tảng như Windows, macOS, Linux
Khả năng mở rộng và có thể nhúng: Giả sử một ứng dụng đòi hỏi sự phức tạp rấtlớn, bạn có thể dễ dàng kết hợp các phần code bằng C, C++ và những ngôn ngữkhác (có thể gọi được từ C) vào code Python Điều này sẽ cung cấp cho ứng dụngcủa bạn những tính năng tốt hơn cũng như khả năng scripting mà những ngônngữ lập trình khác khó có thể làm được
Ngôn ngữ thông dịch cấp cao: Không giống như C/C++, với Python, bạn khôngphải lo lắng những nhiệm vụ khó khăn như quản lý bộ nhớ, dọn dẹp những dữliệu vô nghĩa, Khi chạy code Python, nó sẽ tự động chuyển đổi code sang ngônngữ máy tính có thể hiểu Bạn không cần lo lắng về bất kỳ hoạt động ở cấp thấpnào
Thư viện tiêu chuẩn lớn để giải quyết những tác vụ phổ biến: Python có một sốlượng lớn thư viện tiêu chuẩn giúp cho công việc lập trình của bạn trở nên dễ thởhơn rất nhiều, đơn giản vì không phải tự viết tất cả code Ví dụ: Bạn cần kết nối
cơ sở dữ liệu MySQL trên Web server? Bạn có thể nhập thư viện MySQLdb và
sử dụng nó Những thư viện này được kiểm tra kỹ lưỡng và được sử dụng bởihàng trăm người Vì vậy, bạn có thể chắc chắn rằng nó sẽ không làm hỏng codehay ứng dụng của mình
Hướng đối tượng: Mọi thứ trong Python đều là hướng đối tượng Lập trình hướngđối tượng (OOP) giúp giải quyết những vấn đề phức tạp một cách trực quan VớiOOP, bạn có thể phân chia những vấn đề phức tạp thành những tập nhỏ hơn bằngcách tạo ra các đối tượng
2.2.2 Thư viện Numpy
NumPy là một từ viết tắt của "Numeric Python" hoặc "Numerical Python" Nó làmột mô-đun mở rộng mã nguồn mở cho Python, cung cấp các chức năng biêndịch nhanh cho các thao tác toán học và số Hơn nữa, NumPy làm phong phú
5
Trang 15ngôn ngữ lập trình Python với các cấu trúc dữ liệu mạnh mẽ để tính toán hiệu quảcác mảng và ma trận đa chiều Việc thực hiện thậm chí là nhằm vào ma trận vàmảng khổng lồ Bên cạnh đó các mô-đun cung cấp một thư viện lớn các chứcnăng toán học cấp cao để hoạt động trên các ma trận và mảng Cho phép làm việchiệu quả với ma trận và mảng, đặc biệt là dữ liệu ma trận và mảng lớn với tốc độ
xử lý nhanh hơn nhiều lần khi chỉ sử dụng “core Python” đơn thuần
2.3 Mô hình, các bước thực hiện
Bước 1: Thu tín hiệu (tính hiệu vào là 1 file audio hoặc thu trực tiếp từ micro)
Bước 2: Lấy mẫu tín hiệu
Bước 3: Lượng tử hóa tín hiệu
Bước 4: Biến đổi Fourier từ miền thời gian sang miền tần số
Bước 5: Biểu diễn tín hiệu
2.4 Thiết kế chi tiết
2.4.1 Thu tín hiệu (tính hiệu vào là 1 file audio hoặc thu trực tiếp từ micro) 2.4.2 Lấy mẫu tín hiệu
Âm thanh kỹ thuật số sử dụng điều chế mã xung (PCM) và các tín hiệu kỹ thuật
số để tái tạo lại âm thanh, bao gồm chuyển đổi từ tín hiệu tương tự sang tín hiệu
số (ADC), chuyển đổi từ tín hiệu số sang tín hiệu tương tự (DAC), lưu trữ, vàtruyền Tính hữu ích chính của một hệ thống kỹ thuật số là khả năng lưu trữ, truyxuất và truyền tín hiệu mà không có bất kỳ tổn thất nào về mặt chất lượng
Tần số lấy mẫu
Tai người có thể nghe được âm thanh ở tần số trong khoảng 20 Hz-20 kHz,theo định lý Nyquist thì tần số lấy mẫu tối thiểu phải là 40 kHz, vì vậy người tathường lấy mẫu với tần số 44.1 kHz (CD), 48 kHz (pro audio) hay 96 kHz
Hiện nay, công nghệ lấy mẫu có xu hướng sử dụng tần số lấy mẫu vượt quá cácyêu cầu cơ bản, ví dụ 96 kHz hay thậm chí là 192 kHz Điều này trái ngược vớinhững kết quả trong phòng thí nghiệm chứng minh rằng tai người không thể ngheđược những âm thanh ở tần số siêu âm, tuy vậy trong một vài trường hợp, thìnhững siêu âm có khả năng tương tác và điều chỉnh một phần của phổ tần âmthanh (biến dạng do điều biến tương hỗ; intermodulation distortion hay IMD) Sựbiến dạng điều biến này không có trong âm thanh thực và vì vậy nó là 1 đặc điểmđặc trưng của âm thanh nhân tạo Một điểm lợi thế là nếu tần số lấy mẫu cao vượtmức thì sẽ giảm được những yêu cầu của bộ lọc thông thấp trong ADC và DAC
Độ sâu số (bit depth
Âm thanh thường được lượng tử hóa với độ sâu số 8, 16 hoặc 20 bit, trên mặt lýthuyết thì cực đại của 'tỷ số tín hiệu trên nhiễu lượng tử' (signal to quantizationnoise ratio; SQNR) sẽ cho ra dạng sóng sin chuẩn (pure sine wave) là khoảng49.93dB, 98.09 dB và 122.17 dB Âm thanh 8-bit nói chung là không còn được
sử dụng nữa do nhiễu lượng tử (cực đại của tỷ số SQNR thấp), mặc dù nhữngbiên mã 8-bit theo thuật toán luật A và luật μ đóng độ phân giải thành 8-bit nhưnglại làm tăng hệ số méo phi tuyến (total harmonic distortion; THD) Chất lượng
âm thanh của CD được mã hóa với 16 bit Nhiễu nhiệt (thermal noise) làm hạnchế số lượng các bit thực sự có thể được sử dụng trong quá trình lượng tử hóa
6
Trang 16Vài hệ thống analog (tương tự) có tỉ số tín hiệu trên tạp âm (SNR hay S/N) vượtquá 120 dB, do đó sẽ cần hơn 20-bit để lượng tử hóa.
2.4.3 Lượng tử hóa tín hiệu
Quá trình xấp xĩ giá trị các mẫu rời rạc Æ chuyển một tập các mẫu rời rạc có sốgiá trị rất lớn thành một tập có số giá trị ít hơn
Vị trí của khối lượng tử hóa trong hệ thống:
Hai kiểu lượng tử hóa:
Kiểu làm tròn (rounding)
Kiểu cắt bớt (truncation)
Đặc tính của bộ lượng tử hóa thể hiện qua quan hệ ngõ vào - ngõ ra:
Ví dụ: Bộ lượng tử hóa đều (uniform quantizer) 3 bit
Với bộ lượng tử hóa có tầm toàn thang R, biểu diễn B bitÆ 2B mức lượng tử
o Độ rộng lượng tử:
o Sai số lượng tử:
7
Trang 17Sai số lượng tử (quantization error) hay nhiễu lượng tử (quantizationnoise): biến ngẫu nhiên có phân bố đều, được đặc trưng bằng sai số hiệu dụng:
Tỉ số SNR của bộ lượng tử hóa:
Nhận xét:
Bộ ADC tăng thêm 1 bitÆ tỉ số SNR tăng thêm 6 dB
Số bit càng nhiều thì nhiễu lượng tử càng nhỏ
Tỉ số SNR không phụ thuộc vào biên độ tín hiệu
2.4.4 Biến đổi Fourier từ miền thời gian sang miền tần số
Trong toán học, phép biến đổi Fourier rời rạc (DFT), đôi khi còn được gọi là biếnđổi Fourier hữu hạn, là một biến đổi trong giải tích Fourier cho các tín hiệu thờigian rời rạc Đầu vào của biến đổi này là một chuỗi hữu hạn các số thực hoặc sốphức, làm biến đổi này là một công cụ lý tưởng để xử lý thông tin trên các máytính Đặc biệt, biến đổi này được sử dụng rộng rãi trong xử lý tín hiệu và cácngành liên quan đến phân tích tần số chứa trong một tín hiệu, để giải phươngtrình đạo hàm riêng, và để làm các phép như tích chập Biến đổi này có thể đượctính nhanh bởi thuật toán biến đổi Fourier nhanh (FFT)
Dãy của N số phức được biến đổi thành chuỗi của N số phức X0, , XN−1 bởicông thức sau đây:
với e là cơ số của lôgarit tự nhiên, là đơn vị ảo, và π là pi
8
Trang 18Phép biến đổi Fourier rời rạc ngược (IDFT) được cho bởi công thức sau
Những phương trình này có thể được mô tả đơn giản như sau: các số phức Xk đạidiện cho biên độ và pha ở các bước sóng khác nhau của "tín hiệu vào" xn Phépbiến đổi DFT tính các giá trị Xk từ các giá trị xn, trong khi IDFT tính xn bằngtổng của các sóng thành phần với tần số k / N Khi viết các phương trình dướidạng như trên, ta đã sử dụng công thức Euler để biểu diễn các hàm lượng giácdưới dạng lũy thừa số phức để biến đổi được dễ dàng Khi viết Xk dưới dạng tọa
độ cực, ta thu được biên độ Ak / N và pha φkk từ modulus và argument của Xk:
trong đó atan2 là dạng hai đối số của hàm arctan Cần ghi chú rằng các thừa sốchuẩn hóa của DFT và IDFT (ở đây là 1 và 1/N) và dấu của các số mũ chỉ là quyước, và có thể khác nhau trong các tài liệu khác nhau Điều kiện duy nhất cho cácquy ước này là DFT và IDFT có dấu ngược nhau ở các số mũ và tích của hai thừa
số chuẩn hóa phải là 1/N
2.4.5 Biểu diễn tín hiệu
Chương 3 Triển khai xây dựng
3.1 Fourier
Biến đổi Fourier nhanh, do Cooley và Tukey đề xuất năm 1965, là một thuật toántính toán hiệu quả của Biến đổi Fourier rời rạc (DFT) DFT phân tách một tínhiệu thành một chuỗi có dạng sau:
trong đó x m là một điểm trong tín hiệu đang được phân tích và X k là một 'chếđộ' hoặc thành phần tần số cụ thể Lưu ý rằng thành phần tần số chỉ có thể tăng
9
Trang 19lên đến độ dài của tín hiệu (M-1), và chúng ta sẽ thảo luận một chút sau đó về
những hạn chế từ đó nữa ( Nyquist )
Từ trên, hàm mũ phức có thể được viết lại dưới dạng các hàm sin và côsin bằngcông thức Euler:
Sao cho chuỗi của chúng tôi chứa các sóng hình sin:
Bây giờ chúng ta có thể thấy làm thế nào một tín hiệu có thể được biến đổi thành một chuỗi các sóng hình sin
Lấy mẫu
Cách dễ nhất để kiểm tra FFT bằng Python là đo sóng hình sin ở một tần số đã biết bằng cách sử dụng micrô hoặc tạo một hàm hình sin trong Python Vì phần này tập trung vào việc hiểu FFT, chúng em sẽ trình bày cách mô phỏng một sóng sin lấy mẫu bằng Python Dưới đây là cách tạo sóng sin trong Python bằng cách
sử dụng tiêu chí lấy mẫu mô phỏng tín hiệu thực:
Đoạn mã trên 'lấy mẫu' một sóng hình sin ở 44,1 kHz trong 0,1 giây (100 ms) Tôi đã sử dụng sóng hình sin 100 Hz, vì vậy chúng tôi mong đợi:
Điều này có nghĩa là chúng ta sẽ nhận được 10 chu kỳ từ sóng sin 100 Hz trong 0,1 giây Điều này cũng có nghĩa là chúng ta sẽ có 4410 mẫu cho 10 chu kỳ hoặc
441 mẫu mỗi chu kỳ - con số này khá ít để tái tạo tín hiệu Cốt truyện được tạo bởi mã được hiển thị bên dưới:
10