Tải bản đầy đủ (.docx) (17 trang)

BÁO CÁO BÀI TẬP LỚN đại SỐ TUYẾN TÍNH ỨNG DỤNG SVD để KHỬ NHIỄU âm THANH

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (811.18 KB, 17 trang )

ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
KHOA KHOA HỌC & ỨNG DỤNG
BỘ MƠN TỐN ỨNG DỤNG

BÁO CÁO
BÀI TẬP LỚN ĐẠI SỐ TUYẾN TÍNH
CHỦ ĐỀ 8:
ỨNG DỤNG SVD
ĐỂ KHỬ NHIỄU ÂM THANH
LỚP L08 _ NHÓM 8
GV HƯỚNG DẪN: NGUYỄN ANH THI
NGUYỄN XUÂN MỸ

TP.HCM, Ngày 6 tháng 12 năm 2021


ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
KHOA KHOA HỌC & ỨNG DỤNG
BỘ MƠN TỐN ỨNG DỤNG

BÁO CÁO
BÀI TẬP LỚN ĐẠI SỐ TUYẾN TÍNH
CHỦ ĐỀ 8:
ỨNG DỤNG SVD ĐỂ KHỬ NHIỄU ÂM THANH

Danh sách thành viên:
MSSV

Họ và tên



Ghi chú

2113932

Lê Quang Long

Soạn Word

2113940

Nguyễn Thành Long

2114063

Nguyễn Trần Thái Minh

2110504

Nguyễn Thanh Sang

Tìm Thơng tin

2115057

Đào Nguyễn Nam Trân

Tìm thơng tin

2111057


Lê Trung Điền

Coder

2110130

Bùi Minh Đức

Coder

Tìm thơng tin
Coder

TP.HCM, ngày 6 tháng 12 năm 2021


LỜI CẢM ƠN
Để hoàn thành đề tài bài tập lớn lần này, trước hết nhóm chúng em xin
chân thành cảm ơn sự hướng dẫn, giúp đỡ, quan tâm từ quý thầy cơ, bạn
bè trong lớp.

Đặc biệt, nhóm xin gửi đến cô Nguyễn Anh Thi (lý thuyết) và cô
Nguyễn Xuân Mỹ (bài tập) đã ra sức truyền đạt, chỉ dẫn chúng em đề tài
báo cáo lần này lời cảm ơn sâu sắc nhất.

Khơng thể khơng nhắc tới sự hợp tác, đồn kết của các thành viên trong
nhóm, xin cảm ơn mọi người đã cùng góp sức, góp lực để hồn thành bài
báo cáo này.


Vì cịn tồn tại những hạn chế về mặt kiến thức, trong q trình trao đổi,
hồn thành bài project cuối kì , chúng em khơng tránh khỏi những sai sót,
kính mong nhận được sự đóng góp từ q thầy, cơ. Những góp ý từ thầy
cơ sẽ là động lực để chúng em hoàn thiện hơn. Một lần nữa, nhóm 8_ L08
xin gửi lời biết ơn chân thành đến thầy, cơ vì đã giúp chúng em đạt được
kết quả này.

Nhóm thực hiện đề tài

3

Nhóm 8 - Lớp L08


LỜI MỞ ĐẦU MƠN HỌC
Đại số tuyến tính là mơn học có tầm quan trọng khơng chỉ đối với sinh
viên trường đại học Bách Khoa Thành phố Hồ Chí Minh nói riêng mà
cịn đối với sinh viên ngành khoa học kỹ thuật, cơng nghệ nói chung.
Đại số tuyến tính nói chung có rất nhiều ứng dụng trong hầu hết các lĩnh
vực trong khoa học: kinh tế, môi trường, công nghệ máy tính, xử lí tín
hiệu, đồ họa,…. Một phần nhỏ trong số đó phải nhắc đến là phương pháp
phân tích SVD trong nhiều bài toán khác nhau. Phương pháp phân tích
suy biến (singular value decomposition) được viết tắt là SVD là một trong
những phương pháp thuộc nhóm matrix factorization được phát triển lần
đầu bởi những nhà hình học vi phân. Ban đầu mục đích của phương pháp
này là tìm ra một phép xoay khơng gian sao cho tích vơ hướng của các
vector không thay đổi. Từ mối liên hệ này khái niệm về ma trận trực giao
đã hình thành để tạo ra các phép xoay đặc biệt. Phương pháp SVD đã
được phát triển dựa trên những tính chất của ma trận trực giao và ma trận
đường chéo để tìm ra một ma trận xấp xỉ với ma trận gốc. Phương pháp

này sau đó đã được ứng dụng rộng rãi trong các lĩnh vực như hình học vi
phân, hồi qui tuyến tính, xử lý hình ảnh, cluaxstering, các thuật tốn nèn
và giảm chiều dữ liệu, khử nhiễu âm thanh….

4

MỤC LỤC


TRANG
LỜI CẢM ƠN...................................................................................
1
MỞ ĐẦU MỞ HỌC VÀ SƠ LƯỢC BTL ......................................
2
Chương 1: CƠ SỞ LÍ THUYẾT CỦA PHÂN TÍCH SVD ............
4
Chương 2: ỨNG DỤNG CỦA SVD TRONG KHỬ NHIỄU
ÂM THANH ....................................................................................
9
Chương 1: CHƯƠNG TRÌNH MATLAB ......................................
13
3.1. Các câu lệnh được sử dụng .....................................................
13
3.2. Đoạn code..................................................................................
14
DANH MỤC CÁC TÀI LIỆU THAM KHẢO...............................
15

5



CƠ SỞ LÍ THUYẾT CỦA PHÂN TÍCH
SVD:
Mục tiêu của phân tích suy biến SVD
Phương pháp SVD sẽ tìm ra một lớp các ma trận xấp xỉ tốt nhất với một ma
trận cho trước dựa trên khoảng cách norm Frobenios giữa 2 ma trận. Người ta
đã chứng minh được rằng ma trận xấp xỉ tốt nhất được biểu diễn dưới dạng tích
của 3 ma trận rất đặc biệt bao gồm 2 ma trận trực giao (orthogonal matrix) và
1 ma trận đường chéo (diagonal matrix). Quá trình nhân ma trận thực chất là
quá trình biến đổi các điểm dữ liệu của ma trận gốc thông qua những phép
xoay trục (rotation) và phép thay đổi độ lớn (scaling) và từ đó tạo ra những
điểm dữ liệu mới trong không gian mới. Điều đặc biệt của ma trận đường chéo
đó là các phần tử của nó chính là những giá trị riêng của ma trận gốc. Những
điểm dữ liệu trong khơng gian mới có thể giữ được 100% thông tin ban đầu
hoặc chỉ giữ một phần lớn thông tin của dữ liệu ban đầu thông qua các phép
truncate SVD. Bằng cách sắp xếp các trị riêng theo thứ tự giảm dần trên đường
chéo chính thuật tốn SVD có thể thu được ma trận xấp xỉ tốt nhất mà vẫn đảm
bảo giảm được hạng của ma trận sau biến đổi và kích thước các ma trận nhân
tử nằm trong giới hạn cho phép. Do đó nó tiết kiệm được thời gian và chi phí
tính tốn và đồng thời cũng tìm ra được một giá trị dự báo cho ma trận gốc với
mức độ chính xác cao.
Do đó, để tiếp cận được thuật tốn phân tích SVD, chúng ta cần phải nắm
những kiến thức cơ bản về cơ sở tạo nên nó. Gọi tắt là Cơ sở lí thuyết của việc
phân tích SVD. Chúng ta có thể tham khảo thêm những khái niệm, tính chất
định lí liên quan đến những vấn đề dưới đây qua quyển: “Đặng Văn Vinh, Giáo
trình Đại số tuyến tính, NXB ĐHQG 2020)
-

Ma trận, Định thức


-

Trị riêng và vecto riêng

-

Khái niệm về Họ trực giao và trực chuẩn. Trực giao hóa GramSchmidt.

-

Chéo hóa ma trận, chéo hóa trực giao và những tính chất của
chúng.

6


Q trình phân tích SVD của một ma trận dựa trên cơ
sở lí thuyết đã nêu trên:
Singular Value Decomposition là ứng dụng nổi bật trong Đại số tuyến tính. Bất
kỳ một ma trận A nào với cấp mxn (không nhất thiết phải là ma trận vng), ta
đều có thể phân tích thành dạng:
(!)
Trong đó Q và P là các ma trận trực giao; và Σ là ma trận chéo không vuông
(cấp mxn) với các phần tử trên đường chéo , mặc dù Σ không phải ma trận
vuông nhưng, ta vẫn có thể coi nó là ma trận chéo miễn là các phần tử khác 0
của nó chỉ nằm trên đường chéo (tức là tại các vị trí có chỉ số hàng và chỉ số cột
như nhau); r là Rank(A) bằng số lượng phần tử khác 0 trong ma trận đường
chéo Σ.
*Chú ý rằng cách biểu diễn (!) không là duy nhất, vì ta chỉ cần đổi dấu Q và P
thì vẫn thỏa mãn.



Biểu diễn SVD qua các trường hợp của ma trận A:

+TH1:

+TH2:

7


(H1: SVD cho ma trận A khi: (hình trên), và (hình dưới). Σ là một ma trận
đường chéo với các phần tử trên đó giảm dần và khơng âm. Màu đỏ càng đậm
thể hiện giá trị càng cao. Các ô màu trắng trên ma trận này thể hiện giá trị 0.)
 NGUỒN GỐC SVD

Cho A là một ma trận thực mxn. Ta chứng minh rằng tập hợp các trị riêng khác
không của và là trùng nhau. Thật vậy, giả sử là một trị riêng (eigenvalue)
khác 0 của và là vector riêng (eigenvector) của tương ứng. Khi đó :


Suy ra:

Điều này tương đương với . Vì khác 0 nên khác 0. Suy ra là trị riêng của và
là vector riêng của .
Vì ma trận và là 2 ma trận đối xứng, nên chúng chéo hóa trực giao được. Khi
đó:


(vì , là ma trận đơn vị)




(vì , là ma trận đơn vị)

Suy ra
- Các cột của ma trận là những cơ sở của các không gian con riêng của ma
trận sau khi trực giao hóa Gram - Schmidt và các là các trị riêng khác 0 của
- Các cột của ma trận là những cơ sở của các không gian con riêng của ma trận
của sau khi trực giao hóa Gram - Schmidt và các là các trị riêng khác 0 của
- là ma trận chéo với trị riêng tương ứng của và là . Ta sắp xếp các sao cho
(hình A1)

8



Gọi

COMPACT SVD ( SVD gọn nhẹ hơn)


Viết lại biểu thức (!) dưới dạng tổng với Rank (A) = 1
Với mỗi là một ma trận có hạng bằng 1
Rõ ràng với cách phân tích này, ta nhận thấy rằng ma trận phụ thuộc vào r cột
đầu tiên của và r phần tử khác không trên đường chéo . Ta có phân tích gọn
hơn của gọi là Compact SVD :

Với và là các ma trận được tạo nên từ các cột của và tương ứng, là ma trận
con được tạo bởi hàng đầu tiên và cột đầu tiên của . Nếu ma trận có rank nhỏ

hơn rất nhiều so với số hàng và số cột , ta sẽ được lợi nhiều về việc lưu trữ.
Dưới đây là ví dụ minh hoạ với .

(H2: Biểu diễn SVD dạng thu gọn và biểu diễn ma trận dưới dạng tổng các
ma trận có rank bằng 1.)

9

Sau đây, ta sẽ xét một số ví dụ về phân tích SVD của
một ma trận bất kì:


Bước 1 : Xác định ma trận A(cỡ bao nhiêu) để tiến hành phân tích SVD
Bước 2 : Thực hiện chéo hóa trực giao :
2.1 : Viết phương trình đặc trưng của . Từ đó chúng ta sẽ tính được các giá
trị riêng của . Viết được ma trận đường chéo có các phần tử là những giá
trị riêng, ta vừa tìm được.(Lưu ý phải sắp xếp nó theo thứ tự giảm dần)
2.2 : Tìm vecto riêng của . Sau đó trục giao hóa Gram - Schmidt những cơ
sở của khơng gian con riêng đó Từ đó ta tính được ma trận , các cột của là
các vecto riêng của .

Bước 3 : Thực hiện chéo hóa trực giao .
 Tương tự các bước 2.1, 2.2 ta tính được và .

Bước 4: Chọn bằng cách chọn ma trận cỡ tương ứng phù hợp với hay.
Sau đó lấy căn bậc 2 của tất cả những phần tử trên đường chéo.

Bước 5:Vậy phân tích SVD của ma trận A sẽ là : .
Giả sử phân tích SVD một ma trận vng cấp 2, ta thực hiện như sau :


Nhận xét: Như vậy từ dữ liệu ban đầu, chúng ta có thể viết nó dưới dạng một
ma trận. Q q trình chéo hóa trực giao ma trận và ma trận chuyển vị của nó,
chúng ta được phân tích SVD. Trên cơ sở đó, ta có thể dễ dàng ứng dụng chúng
vào nhiều lĩnh vực khác nhau trong khoa học.

ỨNG DỤNG CỦA PHÂN TÍCH SVD
TRONG VIỆC
10
KHỬ NHIỄU
ÂM THANH
Đặt vấn đề:


Trong cuộc sống hiện nay, chúng ta bắt gặp được rất nhiều loại âm thanh khác
nhau trong từng hoàn cảnh khác nhau. Chẳng hạn như: âm thanh trong một
buổi hòa nhạc, tiếng trẻ con nô đùa với nhau, tiếng xe cộ chạy trên đường…

Đôi khi chúng ta muốn ghi lại những âm thanh,
những khoảng khắc bất chợt nào đó, ta có thể sử
dụng nhiều phương tiện khác như như điện
thoại, máy ghi âm. Hay ta muốn nghe lại một
bản nhạc nhẹ nhàng. Nhưng một điều chắc chắn
không thể tránh khỏi đó là những tập tin âm
thanh đó ln chứa đầy tạp âm(tiếng ồn, tiếng
gió hú ríu rít,…) khiến cho chất lượng âm thanh
giảm đáng kể gây khó chịu cho người nghe.
Lấy một ví dụ điển hình là
một bạn học sinh muốn ghi
âm lại lời thầy giáo giảng
bài trên lớp, nếu như đó là

file ghi âm nguyên thủy (
file gốc chưa qua xử lí) thì
cậu ấy sẽ rất khó chịu do có
quá nhiều tạp âm xung
quanh, như vậy sẽ ảnh
hưởng đến việc tiếp thu bài
của bạn học sinh đó.

Như vậy, một vấn đề cần đặt ra rằng làm sao để khử nhiễu được một tập tin âm
thanh mà chúng ta mong muốn?
 Về mặt ý nghĩa: Nếu như, chúng ta có thể xử lí tốt một tập tin âm thanh

theo các tiêu chí (trọng tâm, chính xác , hiệu quả và tiết kiệm thời gian)
thì việc đó sẽ giúp ích cho ta rất nhiều. Trong nghiên cứu về âm thanh,
sẽ giúp ta tiết kiệm11 thời gian hơn. Còn trong doanh nghiệp chuyên về
lĩnh vực truyền thông đa phương tiện, nếu xử lí tốt file âm thanh, sẽ tiết
kiệm được rất nhiều chi phí trong việc thiết kế một phần mềm nào đó,
hay chỉ đơn giản là tăng chất lượng âm thanh trong q trình edit video
chun nghiệp Từ đó nó sẽ hướng đến nhiều đối tượng khách hàng hơn


với một trải nghiệm về chất lượng âm thanh tuyệt vời, chân thật và đặt
biệt khơng cịn tạp âm nữa.
 Chẳng hạn như các tập đồn cơng nghệ hàng đầu lớn trên thế giới luôn
chạy đua, cạnh tranh gay gắt với nhau về việc thu và phát âm thanh trên
các thiết bị điện thoại thông minh, ti vi thông minh… làm sao cho tối ưu
và hiệu quả nhất. Điều đó đồng nghĩa với việc sẽ tạo điều kiện mở rộng
cơ hội việc làm trong lĩnh vực âm thanh nói chung và cơng nghệ số nói
riêng. Nắm bắt được xu thế, nắm bắt được cơng nghệ chính là nắm lấy
thành cơng.


Khử nhiễu âm thanh qua thuật tốn phân tích SVD
a. Về ứng dụng hỗ trợ: Hiện tại có rất nhiều ứng dụng hỗ trợ xử lí

âm thanh, đặc biệt là khử nhiễu dễ sử dụng và tiếp cận với người
dùng một cách nhanh chóng. Có thể kể đến như: Audio Editor,
Ringtone Editor, WavePad Sound Editor, AudioDroid,...
Điểm chung của tất cả các phần mềm này chúng đều được viết dựa trên những
đoạn Code xử lí âm thanh trong C++, C#, Pascal, Python, Matlab….Chúng ta
sẽ nghiên cứu cách xử lí âm thanh từ những ngơn ngữ lập trình này. Trên
phương diện khảo sát của nhóm, chúng ta sẽ thực hiện khử nhiễu âm thanh trên
Matlab bởi lẽ: nó là một phần mềm cung cấp một mơi trường hồn hảo về cơng
cụ tính tốn cũng như lập trình. Người sử dụng có thể thực hiện phép tính tốn
với ma trận , vẽ đồ thị, hàm số và tạo ra những thuật toán riêng cho mình. Đồng
thời matlab cũng liên kết với nhiều ngơn ngữ lập trình khác thuận tiện cho
người sử dụng.
b. Về thuật tốn

Trong Matlab, có rất nhiều phương pháp khác nhau để khử nhiễu âm thanh như
phép biến đổi Fourier hữu hạn, phân tích SVD, phân tích thành phần chính
PCA…
Như đã trình bày ở phần 1.1, việc khử nhiễu bằng phân tích SVD sẽ có nhiều
ưu điểm thuận lợi, thơng qua việc biến đổi những điểm dữ liệu mới trong
không gian, mà vẫn đảm bảo được hạng của ma trận và kích thước các nhân tử
của ma trận trong một giới hạn cho phép. Như vậy, nhờ thuật tốn đó chúng ta
cod thể xóa bỏ những “vết nhiễu” của âm thanh từ đó giúp đầu ra của âm thanh
được chất lượng hơn.

Quá trình khử nhiễu âm thanh bằnh SVD thơng qua Matlab:
Q trình phân tích SVD cho một file âm thanh trên matlab trải qua các bước

cơ bản như sau
12

Bước 1: Giả sử, ta có một file âm thanh trong máy (đi có thể ở dạng wav,
mp3…) ta chèn nó vào matlab. Bằng lệnh “audioread”
Bước 2: Chúng ta chọn giá trị mẫu(y) và tần số của mẫu(Fs, đơn vị Hz), sau
đó thơng qua lệnh “sound”, chúng ta có thể kiểm tra file âm thanh vừa mới nạp
vào matlab


Bước 3: Qua câu lệnh “plot(y)” hay plot the sound, chúng ta có thể thấy được
file âm thanh đó trực quan trên biểu đồ, giả sử sau khi chèn được file âm thanh,
ta có biểu đồ như sau: ( với những phần đánh dấu x màu xanh là những đoạn
âm thanh có nhiễu với tần số xuất hiện cao, chúng ta cần phải loại bỏ chúng)

Thông qua câu lệnh “Zoom plot(y)” ta có thể quan sát kĩ hơn phần bị nhiễu
trong đoạn âm thanh đó:

Bước 4: Chúng ta tiến hành phân tích SVD để khử đoạn âm thanh bị nhiễu đó,
trên nguyên tắc mã hóa thành một ma trận gồm các nhân tử để chương trình
matlab có thể nhận dạnng được, từ đó bắt đầu phân tích SVD để khử nhiễu nó.
a) Chuyển sound về ma trận A
b) Phân tích SVD ma trận A bởi lệnh [U,S,V]= svd(A)

Ta nhập các dữ liệu U,S,V để tiến hành phân tích SVD. Với U và V là những
ma trận trực giao và S là ma trận đường chéo.(Như hình minh họa các giá trị
U,S,V )
13

Bước 5: Trải qua q trình phân tích ma trận A thành SVD, chọn các điểm

trong khơng gian chính là những đoạn bị tạp âm, để xử lí.Sau khi xử lí hồn
tất, ta dùng câu lệnh “figure, subplot” để hiển thị đoạn âm thanh mà ta vừa
xử lí, để đối chiếu so sánh.


Dùng lệnh “zoom plot”để ta có thể quan sát kĩ hơn, phần đã bị loại bỏ trong
quá trình khử nhiễu do phân tích SVD:



Như vậy qua 5 thao tác trên kết hợp với cơ sở lí thuyết, chúng ta đã có
thể:
1. Hiểu được bản chất của SVD
2. Các q trình của việc phân tích SVD của ma trận A
3. Ý nghĩa, tầm qua trọng của việc khử nhiễu âm thanh nói chung và
phân tích SVD thơng qua chương trình Matlab nói riêng.
4. Nắm sơ lược cáv thao tác cơ bản, bước đầu làm quen với giao diện
Matlab.
14
CHƯƠNG TRÌNH
MATLAB:

1.

Các câu lệnh được sử dụng
-Clear all: Xóa các biến, dữ liệu trước đó


-Audioread(‘Tên file’): Mở 1 file âm thanh cần khử nhiễu có sẵn trong máy
tính.

-Reshape: Sắp xếp thứ tự các số hạng trong 1 ma trận hay tạo ra nhiều mảng
trong ma trận đó.
-[U,S,V] = svd (A) : phân tích SVD ma trận A
-Sigmas= diag(S): gán các giá trị trên đường chéo chính của ma trận S
-plot: Vẽ đồ thị
-rank= [1000] : Đặt giá trị k để file xuất ra âm thanh không bị nhiễu.
-for i=1:length(rank) approx_sigmas = sigmas : loại bỏ các trị riêng thấp.
-approx_S = S : gắn trị riêng đã xử lí vào ma trận S
-Figure: đặt tên file đồ thị
-Xlebel, ylebel: đặt tên trục x, trục y
- Sound: Lệnh phát âm thanh
- Pause: Thực hiện câu lệnh sau 20s
- Diag: Lấy các giá trị trên đường chéo
- Reduction_diagonal_line(80:end) = 0: Khử các giá trị đường chéo từ hàng 80 trở đi
về giá trị 0.
- Fillmissing: Điền vào các giá trị trống vào các giá trị đứng trước đó.

2.

Đoạn code

%% BTL NHĨM 8 ĐẠI SỐ TUYẾN TÍNH GV : NGUYỄN ANH THI , NGUYỄN
XUÂN MỸ
clc; clear;
%% CODE
% Đọc file âm thanh
[Y,Hz] = audioread('amthanh.wav');
15

X = reshape(Y,[],768);

[U,S,V] = svd(X);
t = 0:1/Hz:(length(Y)-1)/Hz;
figure('name','File đồ thị âm thanh ban đầu');


plot(t,Y);
xlabel('Thoi gian (s)');
ylabel('Bien do tin hieu');
title('Đồ thị âm thanh ban đầu');
sound(Y,Hz);
pause(20);

% Khử nhiễu
reduction_diagonal_line = diag(S);
reduction_diagonal_line(80:end) = 0;
len_S = length(reduction_diagonal_line);
reduciton_S = S;
reduciton_S(1:len_S,1:len_S) = diag(reduction_diagonal_line);
new_X = U*reduciton_S*transpose(V);
new_Y = reshape(new_X,[],2);
new_Y = fillmissing(new_Y,'previous');
figure('name','File đồ thị âm thanh sau khi khử nhiễu');
plot(t,new_Y,'b');
title('đồ thị âm thanh sau khi khử nhiễu');
xlabel('Thoi gian (s)');
ylabel('Bien do tin hieu');
sound(new_Y,Hz);

16



Nhận xét:

Qua quá trình khử nhiễu SVD bằng chương trình Matlab , ta thấy âm
thanh trong bản ghi âm đã được lọc bớt những tạp âm (tiếng rè, tiếng nói chuyện từ
xa) trong phần đoạn cuối và giúp cho âm thanh của tiếng đàn trở nên rõ ràng, trong
hơn.

NGUỒN THAM KHẢO
Trong q trình nhóm thực hiện việc nghiên cứu, có sử dụng, tham khảo một
số tài liệu, trang web sau:
Aisha, 2019. Viblo. [Online]
Available at: a/p/handbook-singular-values-decomposition-va-mot-soung-dung-yMnKMOoml7P
Anon., 2015. [Online]
Available at: />Available at: />searchHighlight=noise%20reduction%20audio%20code&s_tid=srchtitle
DayCode, T., 2018. Youtube. [Online]
Available at: />hai, n. v. d., 2020. YouTube. [Online]
Available at: />Talkie, K., 2019. Youtube. [Online]
Available at: />Vinh, Đ. V., 2020. Đại số tuyến tính. NXB Đại Học Quốc Gia.

17



×