Còn nếu miền này là tập hợp các số nguyên Z thì xt được gọi là tín hiệu theo thời gian rời rạc và thường được viết là xn với n là biến nguyên.. Lý thuyết: Ta sẽ tạo sóng hình sine với cá
GIỚI THIỆU ĐỀ TÀI
Đ ẶT VẤN ĐỀ
Khử nhiễu (Noise Cancellation) là quá trình loại bỏ các tín hiệu không mong muốn từ môi trường Trong quá trình thu thập và lấy mẫu tín hiệu, việc thu được tín hiệu gốc hoàn toàn là điều gần như không thể.
Việc khử nhiễu là rất cần thiết do sự hiện diện của nhiễu chồng lấn với tín hiệu gốc Thông thường, chúng ta sử dụng sóng “chống nhiễu” từ nguồn phát thứ cấp để thực hiện khử nhiễu Các nguồn phát này được kết nối với mạch chính theo nhiều cách khác nhau, tùy thuộc vào thuật toán sử dụng Sóng “chống nhiễu” được tạo ra để ngược pha với nhiễu, giúp triệt tiêu lẫn nhau Trong báo cáo này, chúng ta sẽ minh họa quá trình khử nhiễu bằng Python.
Xử lý nhiễu đóng vai trò quan trọng trong nhiều lĩnh vực như điện tử y sinh, xử lý tiếng nói, âm thanh và nâng cao chất lượng hình ảnh Ứng dụng của nó hiện diện trong các thiết bị như tai nghe, điện thoại thông minh, loa thông minh và thiết bị phòng thu.
L Ý THUYẾT TỔNG QUAN
Ý tưởng khử nhiễu dựa trên sự tương tác giữa hai sóng giao thoa, trong đó dạng sóng tổng hợp phụ thuộc vào tần số, biên độ và pha của hai sóng ban đầu Khi hai sóng hình sine có cùng biên độ và ngược pha, sóng tổng hợp sẽ bị triệt tiêu Tuy nhiên, thách thức là xác định chính xác nhiễu và tạo ra sóng “khử nhiễu” đồng thời mà không bị trễ.
Để khử nhiễu âm thanh, người ta thường sử dụng các kỹ thuật khử nhiễu bị động như enclosures, barriers và silencers, tuy nhiên chúng cồng kềnh và đắt tiền, đồng thời kém hiệu quả với nhiễu tần số thấp Ngược lại, các hệ thống khử nhiễu chủ động rất hiệu quả trong việc xử lý nhiễu tần số thấp, có kích thước nhỏ gọn và giá thành rẻ, do đó đang phát triển nhanh chóng Việc khử nhiễu tần số thấp được ưu tiên hơn vì hầu hết nhiễu trong cuộc sống hàng ngày thường dưới 1 KHz, như tiếng ồn từ động cơ và máy bay.
Khi nghiên cứu hiện tượng vật lý, việc quan sát các đại lượng vật lý đặc trưng là rất quan trọng Phương pháp chính để thực hiện điều này là đo lường Các đại lượng vật lý được chuyển đổi thành dòng điện hoặc hiệu điện thế, tạo thành tín hiệu mà máy đo có thể thu nhận Do đó, thông tin đặc trưng của các đại lượng vật lý sẽ được chứa đựng hoàn toàn trong các tín hiệu này.
Hình 1-1 minh họa một tín hiệu thông qua hàm toán học x(t) phụ thuộc vào biến độc lập t Mặc dù t thường được hiểu là thời gian, nó có thể mang nhiều hình thức khác nhau và có thể là một biến vô hướng hoặc một tập hợp các biến vô hướng độc lập (dưới dạng vectơ).
Hình 1-1: Hàm toán học mô tả tín hiệu vật lý cần xử lí
Hình 1-2: Biểu diễn tín hiệu rời rạc theo thời gian
Nếu miền xác định của t là đường thẳng thực R, thì x(t) được gọi là tín hiệu thời gian liên tục hay tín hiệu tương tự Ngược lại, nếu miền này là tập hợp các số nguyên, thì tín hiệu sẽ có đặc điểm khác.
Tín hiệu theo thời gian rời rạc được ký hiệu là x(n), trong đó n là biến nguyên Tín hiệu này bao gồm một chuỗi các giá trị như { , 𝑥0, 𝑥1, 𝑥2, } Hình 1.2 minh họa một tín hiệu rời rạc x(n).
Ứ NG DỤNG THỰC TẾ
Khử nhiễu, hay khử tiếng ồn, là quá trình loại bỏ âm thanh không mong muốn như tiếng xe cộ, tiếng còi xe và tiếng máy khoan Việc này đặc biệt hiệu quả khi áp dụng cho tai nghe, giúp giữ nguyên chất lượng âm thanh gốc và loại bỏ tiếng ồn xung quanh Những người làm việc trong môi trường ồn ào, như gần sân bay hoặc trong nhà máy, có thể sử dụng tai nghe khử tiếng ồn để bảo vệ thính giác Ngoài ra, khử nhiễu còn mang lại nhiều lợi ích trong ngành công nghiệp, như tăng cường hiệu suất làm việc, giảm rung động gây ăn mòn vật liệu và tiết kiệm nhiên liệu Tàu ngầm hoạt động im lặng cũng là một ứng dụng quan trọng của công nghệ khử tiếng ồn.
Hình 1-3: Tai nghe không dây Apple Airpods Pro ứng dụng công nghệ chống ồn chủ động (Active Noise Cancellation)
Hình 1-4: Các loại tai nghe trùm tai (over ear) có ứng dụng công nghệ khử - nhiễu
TẠO SÓNG SIN
T ẦN SỐ
Tần số là số lần của sóng sin lặp lại trong 1 giây
Trong báo cáo này, ta sẽ sử dụng tần số f = 1KHz.
T ỐC ĐỘ LẤY MẪU (S AMPLING ATE R )
Hầu hết các tín hiệu trong đời sống là tín hiệu tương tự, trong khi máy tính xử lý tín hiệu số, do đó cần có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số (ADC) Tốc độ lấy mẫu, tức số lượng mẫu được lấy trong một giây, thường có các giá trị đặc trưng như 8KHz, 44KHz và 48KHz Trong bài viết này, chúng ta sẽ sử dụng giá trị 48KHz, giá trị phổ biến trong thiết bị âm thanh.
C ÔNG THỨC SÓNG SINE
A: biên độ f: tần số t: mẫu Vì chúng ta cần chuyển đổi sang số, nên cần chia t cho tốc độ lấy mẫu Lưu ý: Biên độ Amplitude
Trong hầu hết các tài liệu, giá trị A thường được chọn ngẫu nhiên, thường là 1, nhưng điều này không hiệu quả cho việc tạo tín hiệu sóng sine Sóng sine được tạo ra ở dạng dấu chấm động, thuận tiện cho việc vẽ đồ thị nhưng không hỗ trợ lưu trữ vào tệp do chúng ta xử lý các số nguyên Trong các tệp sóng âm thanh, tín hiệu được viết ở dạng số nguyên 16 bit, và nếu sử dụng dấu chấm động, nó sẽ không được biểu diễn chính xác Để khắc phục vấn đề này, cần chuyển đổi số từ dạng dấu chấm động sang dạng điểm cố định bằng cách nhân biên độ với một hằng số cố định Giá trị lớn nhất của số 16 bit có dấu là.
2 15 − 1 2767 (vì bit đầu tiên là bit dấu)
Để đảm bảo tín hiệu âm thanh được phát ra đồng đều trên toàn thang, chúng ta cần nhân biên độ với 32767 Nếu muốn tín hiệu âm thanh có độ lớn bằng một nửa, hãy sử dụng biên độ 16000.
T ẠO ÂM THANH HÌNH SINE
Trước hết, ta cần tìm hiểu các thư viện cần sử dụng trong phần này, bao gồm:
The article discusses the significance of various Python libraries for data processing and visualization It highlights the use of NumPy, a package that facilitates efficient numerical computations Additionally, it mentions the wave module, which provides an interface for handling audio file formats The struct module is also noted for its ability to convert between Python values and C structs Finally, it introduces Matplotlib's pyplot, a tool for creating visual plots and graphs.
Sau đây, chúng tôi sẽ trình bày các bước tạo âm thanh bằng sóng hình sine
2.4.1 Tạo sóng hình sine với tần số 1000 Hz a Lý thuyết:
Ta sẽ tạo sóng hình sine với các thông số sau đây:
Tốc độ lấy mẫu: Sampling_rate = 48000 Hz
Số lượng mẫu: Num_sample = 48000
Danh sách lưu các mẫu: Sine_wave =[ ]
Hàm [for x in range(num_samples)]:
Sin-wave.append(np.sin(2*np.pi*frequency*x/sampling_rate))
Với: x chạy từ 0 tới (num – sampling) -1
T = 1/sampling-rate: khoảng thời gian liên tiếp giữa hai lần lấy mẫu n là số thứ tự của mẫu
Additionally, the for loop can be used for a more concise approach, as demonstrated by the following code: \[\text{ave} = [\text{np.sin}(2 \cdot \text{np.pi} \cdot \text{frequency} \cdot x / \text{sample\_rate}) \text{ for } x \text{ in range}(\text{num\_samples})]\]
Hình 2-1: Code tạo sóng sine với tần số 1000Hz
Sử dụng hàm plt.plot để hiển thị sóng sine tần số 1000 Hz
Hình 2-2: Code vẽ sóng sine
Hình 2-3: Vẽ sóng sine, f = 1KHz
2.4.3 Lưu sóng sine với định dạng wave a Lý thuyết:
Đối với mỗi giá trị x từ 0 đến num_samples, ta sẽ tính toán giá trị sine tương ứng trên trục y Tất cả các giá trị này sẽ được lưu trữ trong một danh sách Trước tiên, chúng ta cần xem xét một số hàm sẽ được sử dụng.
Số kênh của âm thanh: nchannels (thường là 1 - mono audio)
Chiều dài mẫu đơn vị: sampwidth (thường là 2 bytes)
Dữ liệu không được nén: comptype (compression type) → NONE compname (compression name) → not compressed. b Code:
Hình 2-4: Code khai báo số kênh âm thanh, chiều dài mẫu, số lượng mẫu và dữ liệu
Sau đó, viết các giá trị lấy mẫu vào file wave:
Hình 2-5: Code thực hiện mở file wave
● Thiết lập và chỉnh sửa các thông số:
Hàm writeframes là hàm ghi một sóng sine
Để ghi chép tín hiệu âm thanh vào tệp, cần chuyển đổi tín hiệu từ dạng số dấu chấm động sang dạng số nguyên 16 bit Quá trình này bao gồm việc nhân biên độ với một hằng số cố định, cụ thể là sử dụng công thức int(s*amplitude).
Dữ liệu thu được chỉ là danh sách các con số và không thể đọc được bởi các trình chơi nhạc thông dụng như Windows Media Player, VLC Player hay Audacity Do đó, cần sử dụng thư viện Struct để chuyển đổi và đóng gói dữ liệu dưới dạng nhị phân, giúp các trình phát âm thanh có thể đọc dữ liệu.
Chúng ta sẽ xem xét một ví dụ để hiểu rõ chức năng chuyển đổi của thư viện này Đầu tiên, ghi giá trị 0.5 vào tệp và chuyển đổi nó thành một số điểm cố định bằng cách nhân với 16000, kết quả sẽ là 10912 dưới dạng chuỗi số nguyên.
Hình 2-6: Kết quả chuyển đổi dữ liệu sóng sine 0.5 sang dạng số nguyên
Sử dụng hàm struct.pack, số 7664 được chuyển đổi thành x1DF0 Do giá trị 16 bit và số nguyên 7664 vượt quá giới hạn 16 bit, struct chia thành hai số xF0 và x1D Giờ đây, chúng ta có thể đọc file wav bằng các trình phát âm thanh phổ biến.
Hình 2-7: Kết quả chuyển đổi dữ liệu dạng số nguyên sang dạng thập lục phân
Sử dụng vòng lặp for để lấy các mẫu sóng sine và ghi nó vào tệp, test.wav dưới dạng âm thanh 16 bit
Hình 2-8: Code ghi dữ liệu vào file wave
Lưu ý: ‘h’ có nghĩa là hex, hệ thập lục phân
2.4.4 Kiểm tra tần số của âm thanh
Sau khi thiết lập thông số, chúng ta thu được sóng sine Sử dụng Audacity để quan sát sóng cũng như dạng phổ
Lưu ý rằng, ở mục trên, chúng ta đã nhân biên độ với hằng số 16000 nên thang biên độ sẽ ở mức 0.5 thay vì 1
Hình 2-9: Kết quả hiển thị dạng sóng sine với tần số 1Khz thu được từ file wave
Hình 2-10: Kết quả hiển thị phóng to dạng sóng sine với tần số 1Khz thu được từ file wave
Thực hiện kiểm tra tần số trên Audacity, Edit → Select All ( hoặc Ctrl + A), sau đó vào Analyse → Plot Spectrum
Hình 2-11: Kết quả phân tích phổ tuyến tính
Như vậy, ta có thể thấy rằng đỉnh nằm gần giá trị 1000Hz.
TÍNH TẦN SỐ SÓNG HÌNH SINE
C Ơ SỞ LÝ THUYẾT
Biến đổi Fourier là công cụ chuyển đổi tín hiệu từ miền thời gian hoặc không gian sang miền tần số Hai miền này chỉ là các cách biểu diễn khác nhau của tín hiệu, và biến đổi Fourier thể hiện mối quan hệ toán học giữa chúng Sự thay đổi của tín hiệu trong một miền sẽ ảnh hưởng đến miền còn lại, nhưng không nhất thiết theo cùng một cách Biến đổi Fourier rời rạc (DFT) được áp dụng cho các tín hiệu số hóa, trong khi Biến đổi Fourier nhanh (FFT) là thuật toán giúp tính toán DFT một cách nhanh chóng và hiệu quả.
Biến đổi Fourier rời rạc (DFT) là công cụ quan trọng trong xử lý tín hiệu số, giúp tính toán phổ của tín hiệu có thời gian hữu hạn Việc mã hóa thông tin trong các sóng hình sin là phổ biến, nhưng trong một số ứng dụng, hình dạng sóng miền thời gian không phù hợp Trong những trường hợp này, nội dung tần số của tín hiệu trở nên hữu ích Thuật toán chuyển đổi tín hiệu từ miền thời gian sang các thành phần miền tần số được gọi là biến đổi Fourier rời rạc (DFT).
Biến đổi Fourier rời rạc (DFT)
Phổ của một tín hiệu theo thời gian liên tục x(t) là biến đổi Fourier của x(t), viết tắt là FT (Fourier Transform) được định nghĩa bằng toán học như sau:
Lúc x(t) được lấy mẫu bởi chuỗi xung Dirac vô hạn Δ(t) với chu kỳ lấy mẫu
T, ta có tín hiệu được lấy mẫu:
Lấy biến đổi Fourier của 𝑥𝛥(t), ta được:
Nếu ta đặt ꞷ = ΩT thì ꞷ có đơn vị là radian Gọi 𝑥 𝑑 (n) = x(nT) và đặt:
Biến đổi Fourier theo thời gian rời rạc (DFT) của tín hiệu rời rạc 𝑥 𝑑 (n) được xác định bởi phương trình trên Khi không xem xét vận tốc lấy mẫu, ꞷ trở thành biến độc lập, cho phép phân tích DFT mà không cần quan tâm đến quá trình lấy mẫu, áp dụng cho mọi tín hiệu rời rạc Hàm 𝑋 𝑑 (ꞷ) có chu kỳ 2π, do đó chỉ cần xem xét một chu kỳ của nó, có thể từ 0 đến 2π hoặc từ -π đến π Tần số số ꞷ có đơn vị là radian.
Trong trường hợp 𝑥 𝑑 (n) là một tín hiệu thực, ta có tính chất sau:
Kết quả cho thấy biên độ của 𝑋 𝑑 (ꞷ) là hàm chẵn và pha là hàm lẻ, cho thấy tất cả thông tin của phổ nằm trong vùng tần số dương Do đó, khi phân tích phổ của tín hiệu 𝑥 𝑑 (n) thực, chỉ cần xem xét từ 0 đến π Nếu tính được 𝑋𝑑(ꞷ), có thể suy ra 𝑋𝛥(Ω) và từ đó xác định phổ tín hiệu x(t), với điều kiện thỏa mãn quy tắc lấy mẫu Nyquist.
Phép biến đổi DFT nghịch:
Hình 3-1: Tín hiệu trong miền thời gian P(t) được biểu diễn trên miền tần số
P(v) nhờ phép biến đổi Fourier
Biến đổi Fourier nhanh (FFT)
Biến đổi Fourier nhanh (FFT) là các thuật toán tối ưu hóa cho phép thực hiện phép biến đổi Fourier rời rạc (DFT), giúp phân tích tín hiệu rời rạc theo thời gian trong miền tần số một cách hiệu quả FFT mang lại sự cải thiện đáng kể về tốc độ và đơn giản hóa quá trình tính toán.
Các thuật toán FFT giúp giảm đáng kể độ phức tạp tính toán của DFT, rút ngắn thời gian và số lần thực hiện phép toán, đặc biệt là các phép nhân tốn thời gian Hiệu quả của các thuật toán này tăng lên khi kích thước N của DFT lớn Ngoài các thuật toán nhanh ban đầu, hiện nay còn có nhiều thuật toán mới được áp dụng rộng rãi.
Các phép toán biến đổi:
3.2 Biến đổi Fourier chuyển đổi tín hiệu.
Biến đổi Fourier chuyển đổi tín hiệu miền thời gian sang miền tần số Tín hiệu miền thời gian
Hình 3-1 dưới đây biểu diễn dạng sóng đang thay đổi theo thời gian Trong tệp âm thanh, trình phát sẽ di chuyển ngay khi tệp phát
Hình 3-2: Đồ thị biểu diễn dạng sóng thay đổi theo thời gian
Tín hiệu miền tần số
Trong miền tần số, có thể quan sát thấy tần số của tín hiệu Hình 3 2 dưới đây - biểu diễn dạng tín hiệu trong miền tần số
Tín hiệu sẽ thay đổi nếu thêm hoặc bớt tần số và sẽ không thay đổi về theo thời gian
Tốc độ xử lý của DFT chậm, không đáp ứng nhu cầu sử dụng, do đó FFT đã được phát minh Hiện nay, FFT được ứng dụng rộng rãi trong hầu hết các thiết bị điện tử.
Dựa vào cách thức biến đổi đã nêu, chúng ta có thể hiểu cách hoạt động và xử lý tín hiệu thông qua FFT, từ đó xác định tần số của tín hiệu cơ bản.
Trong phần này, chúng ta sẽ đọc tệp test.wav đã được tạo ở chương I và chuyển toàn bộ dữ liệu sang dạng mảng.
Trước hết, dùng hàm wave readframes() đọc tất cả các trạng thái âm thanh wav_file = wave.open(infile, ‘r’) data = struct.unpack('{n}h'.format(n=num_samples), data)
Chúng ta đã sử dụng thư viện struct và hàm struct.pack để đóng gói dữ liệu ở dạng nhị phân Để đọc trạng thái âm thanh, cần thực hiện quá trình ngược lại, tức là chuyển đổi dữ liệu từ dạng nhị phân về dạng số nguyên.
Sử dụng hàm struct.unpack giải nén num_samples từ dạng thập lục phân về số nguyên
Chuyển đổi dữ liệu thành mảng numpy bằng cách sử dụng lệnh `data = np.array(data)` Sau đó, áp dụng hàm numpy fft để lấy toàn bộ dữ liệu từ mảng với lệnh `data_fft = np.fft.fft(data)`.
Hình 3-4: Code chuyển dữ liệu sang thành mảng b Chuyển số phức thành các giá trị thực
Sau khi chuyển toàn bộ dữ liệu vào mảng numpy, vấn đề phát sinh là hàm fft trả về một mảng các số phức, điều này gây khó khăn trong việc đọc tần số.
Cụ thể là, nếu thực hiện in ra 6 giá trị đầu tiên của fft, ta thu được kết quả sau:
Hình 3-5: Kết quả khi thực hiện in ra 6 giá trị đầu tiên của fft
Hàm numpy abs() có thể được sử dụng để chuyển đổi tín hiệu từ dạng số phức sang dạng số thực, tức là loại bỏ phần phức và giữ lại phần thực của dữ liệu.
Hình 3-6: Code chuyển đổi phức sang thực c Cách fft trả về kết quả.
FFT cung cấp tất cả các tần số có thể có trong tín hiệu Nếu chúng ta lưu trữ kết quả FFT trong mảng data_fft, thì data_fft[1] sẽ chứa giá trị của tần số 1Hz và data_fft[2] sẽ chứa giá trị của tần số 2Hz.
… data_fft[1000] sẽ chứa giá trị của tần số 1000Hz
Nếu trong tín hiệu đầu vào không có tần số 1Hz thì giá trị data_fft[1] sẽ rất nhỏ, data_fft[1]= 0.00000000000855 Nhưng với data_fft[1000] ≈ 2400
Hình 3-7: FFT trả về các tần số có thể có trong tín hiệu
Tìm phần tử trong mảng có giá trị lớn nhất
Hình 3-8: Code tìm phần tử có giá trị lớn nhất trong mảng
Hàm np.argmax sẽ trả về tần số có giá trị lớn nhất trong tín hiệu đầu vào, sau đó in ra màn hình
Hình 3-9: Kết quả trả lại tần số có giá trị lớn nhất
Như vậy ta thu được kết quả tần số có giá trị lớn nhất là 1000Hz, phù hợp với tín hiệu đầu vào
Vẽ biểu đồ dữ liệu
Hàm subplot() cho phép chúng ta vẽ nhiều biểu đồ trên cùng một cửa sổ
Ví dụ: plt.subplot(2,1,1) có nghĩa là biểu đồ này có 2 hàng, 1 cột và biểu đồ này là biểu đồ đầu tiên
Hàm plt.plot() mặc định cho phép ta vẽ đường nối giữa điểm với điểm trong biểu đồ
Hàm plt.title()cho phép chúng ta đặt tên cho biểu đồ.
Hàm plt.xlim() cho phép chúng ta đặt giới hạn của trục x
Hình 3-10: Code để vẽ biểu đồ dữ liệu
Hình 3-11: Kết quả dạng sóng và dạng phổ thu được
Chúng ta đã thu được tệp âm thanh và xác định các tần số khả thi của nó Tiếp theo, chúng ta sẽ thêm tín hiệu nhiễu và thực hiện quá trình loại bỏ tín hiệu nhiễu này.
B IẾN ĐỔI OURIER CHUYỂN ĐỔI TÍN HIỆU F
Trong chương này, chúng ta sẽ tạo ra một tín hiệu hình sine, thêm tín hiệu nhiễu vào và sau đó tiến hành lọc tín hiệu nhiễu
Tần số chính (cần thiết) là 1000 Hz, và thêm tần số nhiễu sẽ là 50Hz
Như đã nói ở trên, chúng ta sẽ thực hiện tạo hai sóng hình sine với tần số lần lượt là 1000Hz, 50Hz để loại bỏ tín hiệu 50Hz
Trước tiên, ta sẽ thực hiện khai báo các biến như tần số, tốc độ lấy mẫu, số lượng mẫu
Hình 4-1: Code khai báo các biến
Tiếp theo, viết hàm tạo sóng sine với các tần số tương ứng Có thể tham khảo cách tạo sóng hình sine ở Chương 1
Hình 4-2: Code tạo sóng sine với các tần số tương ứng
Chúng ta sẽ tín hiệu nhiễu vào bằng việc thực hiện với hàm numpy.
XỬ LÝ TÍN HIỆU NHIỄU
T ẠO SÓNG HÌNH SINE
Như đã nói ở trên, chúng ta sẽ thực hiện tạo hai sóng hình sine với tần số lần lượt là 1000Hz, 50Hz để loại bỏ tín hiệu 50Hz
Trước tiên, ta sẽ thực hiện khai báo các biến như tần số, tốc độ lấy mẫu, số lượng mẫu
Hình 4-1: Code khai báo các biến
Tiếp theo, viết hàm tạo sóng sine với các tần số tương ứng Có thể tham khảo cách tạo sóng hình sine ở Chương 1
Hình 4-2: Code tạo sóng sine với các tần số tương ứng
Chúng ta sẽ tín hiệu nhiễu vào bằng việc thực hiện với hàm numpy
Hình 4-3: Code tạo tín hiệu nhiễu
Đ Ồ THỊ
Chúng ta cần đồ thị hiển thị những sóng và tín hiệu ngõ ra
Hình 4-4: Đồ thị biểu diễn dạng sóng tín hiệu gốc, tín hiệu nhiễu và tín hiệu hỗn hợp
Hình 4-5: Code kiểm tra biến đổi fft
Thực hiện biến đổi FFT từ miền thời gian sang miền tần số cho hai tín hiệu đầu vào f 00Hz và nhiễu f PHz, theo các bước đã nêu trong Chương 3 Lưu ý rằng freq chứa tần số trong data_fft.
Hình 4-6: Code vẽ đồ thị trong miền tần số
Hình 4-7: Đồ thị phổ trong miền tần số
Sử dụng bộ lọc FFT, nghĩa là sử dụng hàm numpy
Trước tiên, ta sẽ tạo một mảng filter_freq; biến index để so sánh điều kiện tần số Sau đó thực hiện theo giải thuật sau:
Hình 4-8: Lưu đồ giải thuật
Hình 4-9: Code cho lưu đồ giải thuật
Hình 4-10: Cách code khác cho lưu đồ giải thuật
Để đạt được tần số khoảng 1000Hz, chúng ta sẽ dò tìm trong miền tần số xung quanh giá trị này Tuy nhiên, do ảnh hưởng của nhiễu, việc thu được tần số chính xác là rất khó khăn, dẫn đến một số giá trị có thể bị mất Do đó, chúng ta sẽ giới hạn vùng dò tần số từ 950 đến 1000Hz.
Trong tín hiệu, tần số thường có giá trị nhỏ hơn 1 Nếu tần số lớn hơn 1, chúng ta sẽ lưu vào mảng filter_freq Nếu tần số không nằm trong khoảng 950 đến 1000 Hz hoặc quá nhỏ, ta sẽ lưu giá trị 0 vào mảng filter_freq Sau đó, chỉ số index sẽ được tăng lên và vòng lặp for sẽ tiếp tục.
Sau khi lọc, ta sẽ biểu diễn tín hiệu ở miền thời gian và miền tần số Miền tần số
Hình 4-11: Code vẽ đồ thị tần số sau lọc
Hình 4-12: Đồ thị tần số sau lọc
So sánh tín hiệu sau lọc và tín hiệu nhiễu ban đầu
Hình 4-13: Code vẽ đồ thị so sánh tín hiệu nhiễu và tín hiệu lọc
Hình 4-14: Đồ thị so sánh tín hiệu nhiễu và tín hiệu lọc
THAY ĐỔI THÔNG SỐ KHÁC
TẠO ÂM THANH HÌNH SINE
5.1.1 Tạo sóng hình sine với tần số 2000Hz a Code:
Hình 5-1: Code tạo và vẽ sóng sine với tần số 2000Hz b Kết quả:
Hình 5-2: Kết quả vẽ sóng sine với tần số 2000Hz
5.1.2 Lưu sóng sine với định dạng wave
Hình 5-3: Code lưu sóng sine với định dạng wave
5.1.3 Kiểm tra tần số của âm thanh
Hình 5-4: Kết quả hiển thị dạng sóng sine với tần số 2KHz thu được từ file wave
Hình 5-5: Kết quả hiển thị phóng to dạng sóng sine với tần số 2KHz thu được từ file wave
Hình 5-6: Kết quả hiển thị dạng phổ tuyến tính
Như vậy, ta có thể thấy rằng từ hình 5 6, ta thu được đỉnh nằm gần giá trị -2000Hz.
SỬ DỤNG BIẾN ĐỔI FOURIER TÍNH TẦN SỐ SÓNG HÌNH SINE
Hình 5-7: Code chuyển đổi số phức sang số thực và vẽ biểu đồ dữ liệu b Kết quả
Hình 5-8: Kết quả dạng sóng và dạng phổ thu được
Hình 5.8 biểu diễn tất cả các giá trị tần số có thể có trong tín hiệu đầu vào, giá trị tần số lớn nhất là 2000Hz.
LỌC TẦN SỐ NHIỄU
5.3.1 Tín hiệu trước lọc nhiễu
Trước tiên, thực hiện tạo sóng với tần số 2000Hz và tần số nhiễu 100Hz Chương trình tạo sóng:
Hình 5-9: Code tạo sóng 2000Hz và sóng nhiễu 100Hz Đồ thị sau đây biểu diễn tín hiệu hỗn hợp đầu vào trong miền thời gian:
Hình 5-10: Đồ thị biểu diễn dạng sóng tín hiệu gốc, tín hiệu nhiễu và tín hiệu hỗn hợp
Hình 5-11: Đồ thị phổ trong miền tần số 5.3.2 Tín hiệu lọc nhiễu.
Chương trình lọc nhiễu và hiển thị phổ, sóng sine sau khi lọc nhiều:
Hình 5-12: Code lọc nhiễu và vẽ đồ thị phổ
Hình 5-13: Đồ thị biểu diễn phổ tần số sau lọc
Hình 5-14: Đồ thị so sánh tín hiệu nhiễu và tín hiệu lọc
Vậy là chúng ta đã thực hiện lọc tần số 100Hz, giữ lại tần số cần thiết 2000Hz.