1.1 Giới thiệu đề tài Đề tài: "Phương pháp số cho DFT để khử nhiễu âm thanh" Đề tài tập trung nghiên cứu và ứng dụng Biến đổi Fourier rời rạc DFT trong lĩnh vực xử lý tín hiệu âm thanh,
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO BÀI TẬP LỚN MÔN PHƯƠNG PHÁP TÍNH
ĐỀ TÀI PHƯƠNG PHÁP SỐ CHO DFT ĐỂ KHỬ NHIỄU ÂM THANH
Thành phố Hồ Chí Minh, tháng 12/2024
Trang 2BẢNG PHÂN CÔNG CÁC THÀNH VIÊN TRONG NHÓM
Nguyễn Phùng Linh Ngọc 2312313 Kiểm tra và hướng phát triển Nguyễn Thị Thanh Hằng 2310903 Thuyết trình
Trần Triệu Ngân 2312241 Cơ sở lý thuyết
Bùi Quốc Bình Minh 2312047 Code
Lê Nguyễn Anh Văn 2313860 Cơ sở lý thuyết
Trịnh Anh Khoa 2211655 Code
Trang 3MỤC LỤC
1 MỞ ĐẦU
1.1 Giới thiệu đề tài
1.2 Mục tiêu
1.3 Cách tiếp cận xử lý
2 CƠ SỞ LÝ THUYẾT
2.1 Đặt vấn đề
2.2 Cơ sở lý thuyết
2.2.1 Định nghĩa của ánh xạ tuyến tính
2.2.2 Nhân của ánh xạ tuyến tính
2.2.3 Ánh xạ tuyến tính
2.2.4 Biến đổi Fourier
3 VÍ DỤ SỐ
3.1 Mô tả lệnh code Mathlab
3.2 Lệnh code Mathlab
3.3 Kết quả sau khi chạy code
3.3.1 Tín hiệu gốc
3.3.2 Tín hiệu sau lọc với cutoff = 3500 Hz
3.3.3 Tín hiệu sau lọc với cutoff = 100 Hz
4 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
4.1 Kết luận
4.2 Hướng phát triển
TÀI LIỆU THAM KHẢO
1 MỞ ĐẦU
Bài báo cáo của nhóm 13 chúng em sẽ gồm những nội dung liên quan đến việc sử dụng phương pháp số DFT để khử nhiễu âm thanh Bài báo cáo sẽ chỉ ra cách biến
Trang 4đổi Fourier cũng như các bước lập trình code trong việc khử nhiễu âm thanh Từ đó, hiểu biết thêm về cách xử lí các tạp âm để cho ra một sản phẩm âm thanh hoàn chỉnh nhất
1.1 Giới thiệu đề tài
Đề tài: "Phương pháp số cho DFT để khử nhiễu âm thanh"
Đề tài tập trung nghiên cứu và ứng dụng Biến đổi Fourier rời rạc (DFT) trong lĩnh vực xử lý tín hiệu âm thanh, nhằm mục đích khử nhiễu và nâng cao chất lượng âm thanh Dựa trên khả năng phân tích phổ tần số của DFT, phương pháp số được xây dựng để tách biệt các thành phần tín hiệu hữu ích và loại bỏ nhiễu không mong muốn
Nghiên cứu này không chỉ trình bày nền tảng lý thuyết về DFT và các thuật toán
xử lý, mà còn triển khai thực nghiệm trên các mẫu tín hiệu thực tế để kiểm chứng hiệu quả Kết quả đạt được sẽ được đánh giá và định hướng ứng dụng trong các lĩnh vực như truyền thông, thu âm, sản xuất âm nhạc và các hệ thống xử lý âm thanh thời gian thực
Đề tài đóng góp vào việc phát triển các giải pháp công nghệ hiện đại, đặc biệt trong bối cảnh nhu cầu cải thiện chất lượng âm thanh ngày càng tăng cao
1.2 Mục tiêu
Mục tiêu chính của nghiên cứu là phát triển một thuật toán khử nhiễu âm thanh hiệu quả dựa trên biến đổi Fourier rời rạc (DFT), nhằm nâng cao chất lượng âm thanh và mở rộng ứng dụng của các công nghệ xử lý tín hiệu số trong thực tế
Cụ thể, nghiên cứu sẽ tập trung vào các mục tiêu sau:
Phân tích sâu: Nghiên cứu chi tiết các loại nhiễu thường gặp trong tín hiệu âm thanh, bao gồm nhiễu trắng, màu, xung, và nhiễu hài hòa Đánh giá ảnh hưởng của từng loại nhiễu đến chất lượng âm thanh và khả năng nghe hiểu
Thiết kế thuật toán: Xây dựng một thuật toán khử nhiễu DFT linh hoạt, có khả năng thích ứng với các loại nhiễu khác nhau và các điều kiện làm việc đa dạng Thuật toán sẽ bao gồm các bước tiền xử lý, phân tích phổ, thiết kế bộ lọc thích ứng, tổng hợp lại tín hiệu và hậu xử lý
Đánh giá hiệu quả: Đánh giá hiệu quả của thuật toán thông qua các chỉ số chất lượng âm thanh tiêu chuẩn như PSNR, SNR, và các phép đo chủ quan bằng cách
so sánh âm thanh gốc và âm thanh sau khi khử nhiễu
Trang 5 Tối ưu hóa: Tìm kiếm các phương pháp tối ưu hóa thuật toán để giảm độ phức tạp tính toán, tăng tốc độ xử lý và giảm thiểu độ trễ, nhằm đáp ứng yêu cầu thực thời của các ứng dụng
1.3 Cách tiếp cận xử lý
Discrete Fourier Transform (DFT): Tìm hiểu về nguyên lý biến đổi Fourier rời rạc (DFT), vai trò của nó trong việc phân tích tín hiệu, và cách nó chuyển đổi tín hiệu từ miền thời gian sang miền tần số
Nhiễu âm thanh: Phân loại các loại nhiễu phổ biến trong âm thanh (nhiễu trắng, nhiễu tần số thấp, nhiễu công suất điện, v.v.)
Mục tiêu khử nhiễu: Đảm bảo rằng tín hiệu âm thanh sạch nhưng không làm mất đi các thông tin quan trọng hoặc làm biến dạng tín hiệu
Chuyển tín hiệu sang miền tần số: Sử dụng DFT để phân tích tín hiệu âm thanh thành các thành phần tần số
Phát hiện và lọc nhiễu: Tìm các tần số không mong muốn (nhiễu) và loại bỏ hoặc giảm chúng bằng cách áp dụng ngưỡng lọc
Chuyển lại về miền thời gian: Dùng Inverse DFT (IDFT) để tái tạo tín hiệu âm thanh
đã khử nhiễu
Kiểm tra kết quả: Đánh giá chất lượng tín hiệu âm thanh sau khi khử nhiễu qua các chỉ số như SNR và nghe thử
Báo cáo và kết luận: Tổng hợp các kết quả thử nghiệm, so sánh phương pháp Đưa ra các hạn chế của phương pháp hiện tại và hướng phát triển tương lai
2 CƠ SỞ LÝ THUYẾT
2.1 Đặt vấn đề
Trang 6Trong quá trình hình thành và phát triển của con người, âm thanh là một thứ đóng vai trò vô cùng quan trọng và thiết yếu đối với mỗi cá nhân con người Âm thanh là khởi nguồn của những giai điệu, cảm xúc để từ đó hình thành nên những bản nhạc bất hủ qua từng thế kỉ Nó giúp truyền đạt thông tin, cảm xúc, tạo ra môi trường và không gian cũng như niềm vui và sự thư giản, làm tăng sự hưng phấn cho cuộc sống Do đó để có được những buổi xem phim đầy cảm xúc, những chiếc loa phát nhạc du dương, thì tất cả đã được qua xử lí Vì trong quá trình tạo ra nhưng âm thanh đó thì luôn có những tạp âm không cần thiết làm giảm đi chất lượng âm thanh chính, nên ta cần loại bỏ đi những tạp âm này hay nói cách khác là khử nhiễu âm thanh Và một trong những cách để khử nhiễu phổ biến hiện nay là phép biến đổi Fourier Đây chính là phép biển đổi mà nhóm chúng em muốn trình bày trong bài báo cáo này
2.2 Cơ sở lý thuyết
2.2.1 Định nghĩa của ánh xạ tuyến tính
Ánh xạ giữa hai tập hợp X và Y là một quy tắc sao cho mỗi x thuộc X tồn tại duy nhất một y thuộc Y để y = f(x):
f : X → Y ; ∀x ∈ X ; ∃ ! y ∈ Y : y = f (x)
Cho V và W là hai không gian vecto trên cùng trường số K Ánh xạ tuyến tính f: V
→ W giữa hai không gian vecto V, W là một ánh xạ thỏa:
• (∀v1, v2 ∈ V ): f (v1 + v2) = f (v1) + f (v2)
• (∀α ∈ K , ∀v ∈ V ) : f (αv) = αf (v)
2.2.2 Nhân của ánh xạ tuyến tính
Nhân của ánh xạ tuyến tính
Cho ánh xạ tuyến tính: f : V → W, ta có nhân của ánh xạ tuyến tính f là tập
hợp tất cả các vecto x của không gian vecto V, sao cho f(x) = 0:
Kerf = {x ∈ V | f (x) = 0}
Trang 7Ảnh của ánh xạ tuyến tính
Cho ánh xạ tuyến tính: f : V → W, ta có ảnh của ánh xạ tuyến tính f là tập
hợp tất cả các phần tử y của không gian vecto W sao cho tồn tại x ∈ V để y = f(x):
Imf = { y ∈ W| ∃ x ∈ V : y = f (x)}
Định lý
Cho ánh xạ tuyến tính: f : V → W, ta có:
• Nhân của ánh xạ tuyến tính f (kerf) là không gian con của V
• Ảnh của ánh xạ tuyến tính f (Imf) là không gian con của W
• dim(kerf) + dim(Imf) = dim(V)
2.2.3 Ánh xạ tuyến tính
Cho ánh xạ tuyến tính f : V → W:E = e1, e2, e3, e n là một cơ sở của V.
• F = f1, f2, f3, f n là một cơ sở của W.
• Nếu tồn tại ma trận A mxn sao cho [ f (x) F ] = A E,F [x] E thì ma trận A được gọi
là ma trận ánh xạ tuyến tính của f trong hai cơ sở của E và F
Trang 82.2.4 Biến đổi Fourier
Mục đích
Phép biến đổi Fourier giúp tách tín hiệu dạng sóng thành các tần số riêng lẻ
tạo ra nó tức là thay đổi thông tin dựa trên thời gian thành thông tin dựa trên tần số
Nó là một quá trình mà tín hiệu được biểu diễn dưới dạng sin và cos với các mức tần
số khác nhau
Biến đổi Fourier rời rạc
Các sản phẩm dùng kỹ thuật số, như là video, âm thanh, tín hiệu và hình ảnh
đồ họa, liên tục sử dụng các phép biến đổi Fourier Chúng lọc thông tin theo cách thức kỹ thuật số bằng một dòng mã được gọi là biến đổi Fourier rời rạc
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ời gian 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, biến đổi này là một công cụ lý tưởng để xử lý thông tin trên máy tí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ác ngành liên quan đến phân tích tần số chứa trong một tín hiệu Biến đổi này có thể được tính nhanh bởi thuật toán biến đổi Fourier nhanh (FFT)
Ứng dụng của biến đổi Fourier rời rạc trong khử nhiễu âm thanh
Phép biến đổi Y = F n X được gọi là phép biến đổi fourier rời rạc của vecto X với:
Vecto Y = F n X có dạng Y = A + iB
Vecto A chứa các hệ số αt trong ∑
0
n−1
α tcos2 πt
n
Vecto A chứa các hệ số βt trong ∑
0
n−1
β tcos2 πt
n
⇒ Như vậy dùng phép biến đổi Fourier rời rạc, ta chuyển tín hiệu X ở miền thời gian thành tín hiệu ở miền tần số gồm các hàm cos2 πt
n
⇒ Sau khi biến đổi Fourier rời rạc Y = F n X ta có thể xác định tần số tín hiệu chính
và tần số tín hiệu nhiễu từ đó ta loại bỏ các tín hiệu gây nhiễu và giữ lại tín hiệu
Trang 9Nhờ đó mà ta có thể:
- Loại bỏ nhiễu tần số cố định: Fourier cho phép xác định các tần số nhiễu
cố định trong tín hiệu âm thanh vì vậy ta có thể loại bỏ các tần số gây nhiễu để cải thiện chất lượng âm thanh
- Phân tích tín hiệu và tìm hiểu cấu trúc tần số: Fourier cho phép phân tích tín hiệu âm thanh để tìm hiểu cấu trúc tần số của nó
- Loại bỏ nhiễu từ quá trình thu thập: Giúp loại bỏ những tạp âm trong quá trình thu thập dữ liệu
- Chuyển đổi tín hiệu vào miền tần số: Biến đổi Fourier giúp chuyển đổi tín hiệu từ miền thời gian sang miền tần số Trong miền tần số ta có thể phân tích tần số và xử lí để loại bỏ nhiễu hoặc cải thiện tín hiệu
Trang 103 VÍ DỤ SỐ
3.1 Mô tả lệnh code Mathlab
Trong bài code của nhóm, chúng em đã xây dựng một chương trình dựa trên hai Module: Module khởi tạo giao diện cho bộ khử nhiễu và Module chức năng xử lý nhiễu Ở đây chúng em sẽ tập trung phân tích vào Module chức năng hay nói cách khác là Module chính của chủ đề này
Sơ bộ về Module khởi tạo giao diện:
- Lệnh “load handel.mat”: Tải tín hiệu Handel (Trong trường hợp file âm thanh handel không có sẵn) và phải chú ý đến đuôi file để tránh trường hợp lỗi
- Sử dụng một số hàm như “uifigure” và “global” để thiết lập giao diện bộ khử nhiễu gồm các nút “Chọn file”, “Phát”, “Dừng”, “Lọc nhiễu DFT” song song với việc thiết lập biến toàn cục để lưu trữ dữ liệu âm thanh và trạng thái cũng như định hình và ký hiệu cho các biểu đồ phổ tần số sẽ sử dụng
Phân tích Module xử lý nhiễu bằng DFT (gồm 5 thành phần chính):
- Phân tích tính hiệu âm thanh:0 “filterNoise()”: Đây là tên của hàm, được định
nghĩa để thực hiện nhiệm vụ lọc nhiễu Và dùng hàm “fft()” để thực hiện biến đổi Fourier Kết thúc quá trình nhập vào để phân tích tín hiệu
- Chuyển sang miền tần số bằng DFT: Dùng hàm “filterNoise” để tạo khối lệnh
xử lý lọc nhiễu bằng DFT Khối lệnh này là thành phần chính bao hàm cả hai thành phần tiếp theo trong Module Và dùng lệnh “f = (0:N-1) * Fs / N” để tạo trục tần số tương ứng với tín hiệu đã biến đổi Fourier
- Lọc nhiễu trong miền tần số: Xác định mức tần số cao tần muốn sử dụng để loại
bỏ nhiễu qua dòng lệnh “cutoffFreq = X”, với X là mức tần số nào đó Đối với
chương trình của nhóm thì chúng em chọn mức tần số là 3500 hay nói cách khác
là những mức tần số lớn hơn ngưỡng 3500 sẽ bị loại bỏ khỏi bộ xử lý
- Chuyển ngược về miền thời gian bằng IDFT: Nhóm sử dụng dòng lệnh
“filteredAudio = real(ifft(Y))” để khôi phục tín hiệu bằng IDFT
- Đánh giá tín hiệu sau lọc: Khởi tạo khối lệnh plot dựa trên phổ tần số của tín
hiệu sau khi lọc để vẽ phổ tần số qua một số tùy chỉnh như biến đổi Fourier hay nhân đôi biên độ cho các tần số lẻ Dùng đồ thị phổ tần số mới thu được để rút ra đánh giá cho file âm thanh đã sử dụng
Trang 11Sau khi lọc, hàm “plotSignal(filteredAudio, ax2)” : vẽ tín hiệu thời gian của tín hiệu
đã lọc lên biểu đồ
Hàm “plotSpectrum(filteredAudio, ax4)”: vẽ phổ tần số của tín hiệu đã lọc lên biểu đồ
3.2 Lệnh code Mathlab
function audio_player_with_DFT_and_spectrum
% Tạo giao diện chính
fig = uifigure('Name', 'Audio Player with DFT & Spectrum', 'Position', [300, 300, 700, 650]);
% Nút "Chọn file"
uibutton(fig, 'Position', [20, 600, 100, 30],
'Text', 'Chọn file',
'ButtonPushedFcn', @selectFile);
% Nút "Phát"
playButton = uibutton(fig, 'Position', [140, 600, 100, 30],
'Text', 'Phát',
'ButtonPushedFcn', @playAudio,
'Enable', 'off');
% Nút "Dừng"
stopButton = uibutton(fig, 'Position', [260, 600, 100, 30],
'Text', 'Dừng',
'ButtonPushedFcn', @stopAudio,
'Enable', 'off');
% Nút "Lọc nhiễu DFT"
filterButton = uibutton(fig, 'Position', [380, 600, 100, 30],
'Text', 'Lọc nhiễu DFT',
'ButtonPushedFcn', @filterNoise,
'Enable', 'off');
% Nhãn hiển thị thông tin file
fileLabel = uilabel(fig, 'Position', [20, 570, 560, 20],
'Text', 'Không có file nào được chọn.',
'HorizontalAlignment', 'left');
% Biến toàn cục để lưu trữ dữ liệu âm thanh và trạng thái
global audioData Fs audioPlayer filteredAudio;
audioData = []; % Dữ liệu âm thanh gốc
filteredAudio = []; % Dữ liệu sau khi lọc nhiễu
Fs = 0; % Tần số mẫu
% Tạo trục biểu đồ cho tín hiệu âm thanh
Trang 12ax1 = uiaxes(fig, 'Position', [50, 350, 300, 150]);
ax2 = uiaxes(fig, 'Position', [380, 350, 300, 150]);
% Thêm tiêu đề cho các biểu đồ
title(ax1, 'Tín hiệu gốc');
title(ax2, 'Tín hiệu sau lọc');
% Tạo trục biểu đồ cho phổ tần số
ax3 = uiaxes(fig, 'Position', [50, 50, 300, 150]);
ax4 = uiaxes(fig, 'Position', [380, 50, 300, 150]);
% Thêm tiêu đề cho các biểu đồ phổ tần số
title(ax3, 'Phổ tần số gốc');
title(ax4, 'Phổ tần số sau lọc');
%% Hàm: Chọn file âm thanh
function selectFile(~, ~)
[fileName, filePath] = uigetfile('*.wav', 'Chọn file âm thanh');
if isequal(fileName, 0)
fileLabel.Text = 'Không có file nào được chọn.';
else
fileFullPath = fullfile(filePath, fileName);
[audioData, Fs] = audioread(fileFullPath);
filteredAudio = audioData; % Ban đầu gán bằng tín hiệu gốc
% Cập nhật giao diện
fileLabel.Text = ['File đã chọn: ', fileName];
playButton.Enable = 'on';
filterButton.Enable = 'on';
% Hiển thị tín hiệu gốc và phổ tần số gốc
plotSignal(audioData, ax1);
plotSpectrum(audioData, ax3);
end
end
%% Hàm: Phát âm thanh
function playAudio(~, ~)
if ~isempty(audioData)
if isempty(filteredAudio)
currentAudio = audioData; % Phát tín hiệu gốc
else
currentAudio = filteredAudio; % Phát tín hiệu sau lọc end
audioPlayer = audioplayer(currentAudio, Fs);
play(audioPlayer);
stopButton.Enable = 'on';
playButton.Enable = 'off';
Trang 13end
end
%% Hàm: Dừng âm thanh
function stopAudio(~, ~)
if ~isempty(audioPlayer)
stop(audioPlayer);
playButton.Enable = 'on';
stopButton.Enable = 'off';
end
end
%% Hàm: Lọc nhiễu bằng DFT
function filterNoise(~, ~)
if ~isempty(audioData)
% Bước 1: Phân tích tín hiệu âm thanh
N = length(audioData); % Số mẫu tín hiệu
Y = fft(audioData); % Biến đổi Fourier (DFT)
% Bước 2: Chuyển sang miền tần số bằng DFT
f = (0:N-1) * Fs / N; % Tạo trục tần số
% Bước 3: Lọc nhiễu trong miền tần số
cutoffFreq = 100; % Ngưỡng tần số (Hz)
Y(abs(f) > cutoffFreq) = 0; % Loại bỏ các tần số cao hơn ngưỡng
% Bước 4: Chuyển ngược về miền thời gian bằng IDFT
filteredAudio = real(ifft(Y)); % Chuyển về tín hiệu thời gian (IDFT)
% Cập nhật giao diện
fileLabel.Text = 'Lọc nhiễu DFT thành công Phổ tần số đã được cập nhật.'; playButton.Enable = 'on';
% Bước 5: Đánh giá tín hiệu sau lọc
plotSignal(filteredAudio, ax2);
plotSpectrum(filteredAudio, ax4);
end
end
%% Hàm: Hiển thị tín hiệu âm thanh
function plotSignal(audioSignal, ax)
t = (0:length(audioSignal)-1) / Fs; % Trục thời gian
plot(ax, t, audioSignal);
ax.XLabel.String = 'Thời gian (s)';
ax.YLabel.String = 'Biên độ';
end
%% Hàm: Hiển thị phổ tần số