32
1 SPEECH ENHENCEMENT ALGORITHMS FINAL PROJECT JUN-2012, DUT ELECTRONICS AND TELECOMMUNICATION ENGINEERING DIGITAL SIGNAL PROCESSING MAIN REPORT Author Hoàng Minh Tho [email protected]

Spectral Subtraction and Wiener Filter

Embed Size (px)

DESCRIPTION

The Spectral Subtraction and Wiener Filter Algorithms for Speech Enhencement

Citation preview

Page 1: Spectral Subtraction and Wiener Filter

1

SPEECH ENHENCEMENT ALGORITHMS

FINAL PROJECT JUN-2012, DUT ELECTRONICS AND TELECOMMUNICATION ENGINEERING

DIGITAL SIGNAL PROCESSING

MAIN REPORT

Author Hoàng Minh Thảo

[email protected]

Page 2: Spectral Subtraction and Wiener Filter

2

1. Tổng quan về nâng cao chất lượng tiếng nói:

Tiếng nói đóng vai trò rất quan trọng trong thông tin liên lạc. Quá trình truyền

tín hiệu tiếng nói được truyền đi qua các phương tiện thông tin bị các loại nhiễu tác động

nên chất lượng bị suy giảm. Vì vậy, các thuật toán Speech Enhancement và các kĩ thuật

làm giảm nhiễu được ra đời. Trong bài Lab này ta sẽ đi nghiên cứu 2 thuật toán ước lượng

phổ để khử nhiễu kinh điển là Spectral Subtraction [1] và Wiener Filter [2]. Việc ước

lượng phổ nhiễu đòi hỏi một thuật toán VAD ( Voice Activity Detection ) để tìm khoảng

thời gian không có tiếng nói hoạt động. Ta sẽ đi phân tích từng phần theo sự phát triển của

các thuật toán và đánh giá kết quả mà các thuật toán mang lại.

1.1. Phân tích tín hiệu có nhiễu thành các segment/frame :

Tín hiệu có nhiễu được chia ra thành nhiều Segment ( hay Frame ) có chiều dài

bằng 25 ms với độ dịch là 40% của Window trên suốt chiều dài tín hiệu. Cửa sổ có thể

chọn Rectangle, Hanning, Hamming, Blackman … Việc chọn loại cửa sổ sẽ ảnh hưởng

tới việc khôi phục tín hiệu đã tăng cường sau này. Ở đây, cửa sổ được lựa chọn là

Hamming. Do Hamming là cửa sổ phi tuyến nên khi thực hiện biến đổi FFT thì vô tình đã

làm suy giảm tín hiệu , vì thế yêu cầu đặt ra là các Segment phải sắp xếp chồng lên nhau

theo 1 tỉ lệ dịch (SP) thích hợp , vùng xếp chồng giữa 2 Segment liên tục gọi là “overlap”.

Page 3: Spectral Subtraction and Wiener Filter

3

Minh họa quá trình Segmenting bằng cửa sổ rectwin

y(n) : tín hiệu có nhiễu cộng vào.

SP : shift percentage

W : Window Length

o : số mẫu ở vùng overlap ( o = fix(W*(1-SP)) ) .

L :≜ Noisy Signal Length

Số Segment có thể được tính dựa vào công thức sau:

Number of noisy signal Segments =

(LengthSignal - WindowLength)/(Shift Percentage* WindowLength) + 1 (1)

Dấu ▪ để chỉ là lấy giá trị nguyên nhỏ hơn và gần kết quả nhất.

Khi tín hiệu được phân tích thành các Segment liên tục, thì trong từng Segment, tín

hiệu của chúng ta sẽ biến đổi chậm và nó được xem là tĩnh ( trạng thái dừng ). Khi đó các

thuật toán xử lý triệt nhiễu trong tín hiệu mới có thể thực hiện được một cách hiệu quả.

Cách phân tích tín hiệu được sử dụng là nhân với hàm cửa sổ , mỗi vector Segment có

kích thước WindowLength sau khi phân tích sẽ được lưu vào 1 cột của ma trận, vậy ma

trận Segment sẽ có kích thước WindowLength x NumberOfSegments.

Page 4: Spectral Subtraction and Wiener Filter

4

Thuật toán phân đoạn tín hiệu:

Segment

Window,signal --> Vector coät

#SP samples: #SP = [ W * SP ]#Segments: N = [ (L-W)/ (#SP)+ 1 ] [.] : laáy phaàn nguyeân

Copy [1:W] --> M1 = [(1:W);(1:W);...;(1:W)]NxW

Copy [1:(N-1)]' --> M2 = #SP *[(0:N-1)',(0:N-1)',...,(0:N-1)']NxW

Copy [1:W] --> hw = [(1:W)',(1:W)',...,(1:W)']WxN

Tính ma traän IndexIndexWxN =( M1 + M2 )'

Tính ma traän segmentSeg = signal(Index).*hw

End

Matlab Code: function Seg=segment(signal,W,SP,Window) % SEGMENT chops a signal to overlapping windowed segments % A= SEGMENT(X,W,SP,WIN) returns a matrix which its columns are segmented % and windowed frames of the input one dimentional signal, X. W is the % number of samples per window, default value W=256. SP is the shift % percentage, default value SP=0.4. WIN is the window that is multiplied by % each segment and its length should be W. the default window is hamming % window. % 06-Sep-04 % Esfandiar Zavarehei if nargin<3 SP=.4; end if nargin<2 W=256; end if nargin<4

Page 5: Spectral Subtraction and Wiener Filter

5

Window=hamming(W); end Window=Window(:); %make it a column vector L=length(signal); SP=fix(W*SP); N=fix((L-W)/SP +1); %number of segments Index=(repmat(1:W,N,1)+repmat((0:(N-1))'*SP,1,W))'; % size 256 x 461 when W = 256, SP = .4 hw=repmat(Window,1,N); % size 256 x 461 Seg=signal(Index).*hw; % size 256 x 461 : each column is a frame of signal, consist of 461 frames

1.2. Initial Silence Segments: (khoảng im lặng ban đầu: IS )

Khoảng im lặng ban đầu hay là giai đoạn không có tiếng nói hoạt động trong mỗi file

âm thanh được gán mặc định là 250ms (dựa vào đặc điểm của tín hiệu thoại biến đổi

chậm – ví dụ như sự thay đổi của thanh quản người thường sau 10 → 100 ms ), thể hiện

bước chuyển tiếp giữa hai trạng thái có mặt và không có mặt của tiếng nói . Điều này cho

phép cung cấp một lượng thông tin vừa đủ trong việc ước lượng phổ nhiễu hay phương

sai nhiễu. Nếu số segment của tín hiệu nhỏ hơn số segment trong khoảng im lặng thì có

thể lờ đi thuật toán VAD.

Ta có thể xác định số segments nằm trong khoảng im lặng ban đầu bằng công thức sau:

Number of Initial Silence Segments:

NIS = (IS * FreqSampling - WindowLength)/(Shift Percentage* WindowLength) + 1 (2)

Page 6: Spectral Subtraction and Wiener Filter

6

Ví dụ: Giả sử các Frame/segment được chia có chiều dài 25ms/frame. Tần số lấy mẫu Fs

= 8000 samples/s, SP = 40% .

WindowLength = 0.025s * 8000 samples/s = 200 samples

NIS = (0.25s * 8000 samples/s - 200 samples)/0.4*200 samples = 22

1.3. Voice activity detection ( VAD )

Quá trình xử lý để phân biệt khi nào có tiếng nói hoạt động, khi nào không có tiếng

nói (im lặng) được gọi là sự thăm dò hoạt động của tiếng nói – Voice Activity Detection

(VAD). Thuật toán VAD có tín hiệu ra ở dạng nhị phân quyết định trên một nền tảng

Segment-by-Segment, khi đó Segment có thể xấp xỉ 20-40 ms. Một đoạn tín hiệu có chứa

tiếng nói hoạt động thì VAD = 1, còn nếu đoạn tín hiệu chứa nhiễu thì VAD = 0.

Có một vài thuật toán VAD được đưa ra dựa trên nhiều đặc tính của tín hiệu. Các

thuật toán VAD được đưa ra sớm nhất thì dựa vào các đặc tính như mức năng lượng, soft-

decision VAD, zero-crossing, đặc tính cepstral, LPC (Linear Prediction Code) , phép đo

chu kỳ…

Phần lớn các thuật toán VAD đều phải đối mặt với vấn đề là điều kiện SNR thấp, đặc

biệt khi nhiễu bị thay đổi. Một thuật toán VAD có độ chính xác trong môi trường thay đổi

không thể đủ trong các ứng dụng của Speech Enhancement, nhưng việc ước lượng nhiễu

một cách chính xác là rất cần thiết tại mọi thời điểm khi tiếng nói hoạt động.

Page 7: Spectral Subtraction and Wiener Filter

7

VAD

Tính khoaûng caùch phoå cuûa segment/frame ñang xeùtSpectralDist = max( 20*lg(signal) - 20*lg(noise)), 0 )

Tính giaù trò trung bình cuûa SpectralDistDist = SpectralDist / length(SpectralDist)

Dist < khoaûng caùch phoå ngöôõng ?

NoiseFlag = 1

NoiseCounter + +

NoiseFlag = 0

NoiseCounter = 0

Ñ

NoiseCounter > Soá segment lieântieáp (ngöôõng) ñeå quy ñònh laø nhieãu ?

SpeechFlag = 0 SpeechFlag = 1

End

S

Ñ

S

Matlab Code:

function [NoiseFlag, SpeechFlag, NoiseCounter, Dist]=vad(signal,noise,NoiseCounter,NoiseMargin,Hangover) %[NOISEFLAG, SPEECHFLAG, NOISECOUNTER, DIST]=vad(SIGNAL,NOISE,NOISECOUNTER,NOISEMARGIN,HANGOVER) %Spectral Distance Voice Activity Detector %SIGNAL is the the current frames magnitude spectrum which is to labeld as %noise or speech, NOISE is noise magnitude spectrum template (estimation),

Page 8: Spectral Subtraction and Wiener Filter

8

%NOISECOUNTER is the number of imediate previous noise frames, NOISEMARGIN %(default 3)is the spectral distance threshold. HANGOVER ( default 8 )is %the number of noise segments after which the SPEECHFLAG is reset (goes to %zero). NOISEFLAG is set to one if the the segment is labeld as noise %NOISECOUNTER returns the number of previous noise segments, this value is %reset (to zero) whenever a speech segment is detected. DIST is the %spectral distance. %Saeed Vaseghi %edited by Esfandiar Zavarehei %Sep-04 if nargin<4 NoiseMargin=3; end if nargin<5 Hangover=8; end if nargin<3 NoiseCounter=0; end FreqResol=length(signal); SpectralDist= max(20*(log10(signal)-log10(noise)),0); %SpectralDist(find(SpectralDist<0))=0; Dist=mean(SpectralDist); if (Dist < NoiseMargin) NoiseFlag=1; NoiseCounter=NoiseCounter+1; else NoiseFlag=0; NoiseCounter=0; end % Detect noise only periods and attenuate the signal if (NoiseCounter > Hangover) SpeechFlag=0; else SpeechFlag=1; end

1.4. Ước lượng, cập nhật nhiễu và các thông số khác:

Phương thức ước lượng nhiễu có thể ảnh hưởng lớn đến chất lượng của tín hiệu sau

khi được tăng cường. Nếu nhiễu được ước lượng quá nhỏ thì nhiễu sẽ vẫn còn trong tín

hiệu và nó sẽ được nghe thấy, còn nếu như nhiễu được ước lượng quá lớn thì tiếng nói sẽ

bị méo, và làm sẽ làm tính dễ nghe của tiếng nói bị ảnh hưởng. Cách đơn giản nhất để ước

lượng và cập nhật phổ của nhiễu trong đoạn tín hiệu không có mặt của tiếng nói sử dụng

thuật toán thăm dò hoạt động của tiếng nói (voice activity detection - VAD). Tuy nhiên

phương pháp đó chỉ thoả mãn đối với nhiễu không thay đổi (nhiễu trắng), nó sẽ không

Page 9: Spectral Subtraction and Wiener Filter

9

hiệu quả trong các môi trường thực tế (ví dụ như nhà hàng), ở những nơi đó đặc tính phổ

của nhiễu thay đổi liên tục. Trong bài Lab này chúng ta sẽ đề cập đến thuật toán ước lượng

nhiễu thay đổi liên tục và thực hiện trong lúc tiếng nói hoạt động, thuật toán này sẽ phù

hợp môi trường có nhiễu thay đổi cao.

Chú ý rằng trong thuật toán khử nhiễu Spectral Subtraction (SS), việc trừ phổ sẽ làm

cho biên độ phổ âm, tuy nhiên biên độ phổ thì không thể âm, do đó phải chỉnh lưu nửa

sóng ( nếu giá trị biên độ trừ phổ âm thì cho bằng O ).

푆∧

(ω) = 푌(ω).퐺 (ω) với 퐺 (ω) = 퐆(훚) |퐆(훚)|ퟐ

= max(G(ω), 0) (3)

Khi chỉnh lưu nửa sóng, xuất hiện thành phần nhiễu dư NR = N -휇∧.ejɸn (4)

với biên độ thay đổi từ 0 đến giá trị maximun của tín hiệu trong suốt thời gian không có

tiếng nói hoạt động. Việc giảm nhiễu dư thực hiện như sau:

|푆푖∧

(ω)| =|푆푖∧

(ω)|, nếu|푆푖∧

(ω)| ≥ |NR (ω)|

min |푆푖∧

(ω)| j = i − 1, i, i + 1 , nếu|푆푖∧

(ω)| < |NR (ω)| (5)

Trong đó: |NR (ω)| là giá trị lớn nhất của nhiễu dư đo được khi không có tiếng nói.

Trong giai đoạn không có tiếng nói hoạt động, việc cần làm nữa là nén nhiễu. Ta

định nghĩa tỉ số tín hiệu trên nhiễu:

푇 = 20. lg( ∫ ( )( )

)

Nếu T < -12 dB, thì có thể xem segment đang xét là nhiễu. Và khi đó ta nén nhiễu

với hệ số β .

|푆푖∧

(ω)| = |푆푖∧

(ω)|, 푇 ≥ 12푑퐵

훽. |푆푖∧

(ω)|, 푇 < 12푑퐵 (6)

Với: 20.lg(β) = -30 dB hay β = 0.03

1.5. OverlapAdding trong quá trình xử lý tín hiệu tiếng nói

Sau khi các Segment tín hiệu được xử lý triệt nhiễu trong miền tần số, các Segment

này được liên kết lại nhau bằng phương pháp thích hợp với phương pháp phân tích tín

hiệu thành các Segment ở đầu vào gọi là “OverlapAdding”, nhằm khôi phục tín hiệu sạch.

Page 10: Spectral Subtraction and Wiener Filter

10

Quá trình xử lý tín hiệu tiếng nóiuá

Mô tả xây dựng phương thức OverlapAdding :

Từ đó ta xây dựng lưu đồ thuật toán như sau:

Page 11: Spectral Subtraction and Wiener Filter

11

OverlapAdd2

Khoâi phuïc Spectrogram cuûa tín hieäuvôùi ñaày ñuû bieân ñoä vaø pha

Spec 1/2WxFreqNum = Xnew . e^(j.Yphase)

FreqNum = soá coät cuûa Spec

Khoâi phuïc moät nöõa lieân hôïpphöùc ñoái xöùng cuûa Spec 1/2WxFreqNum

Spec 1/2WxFreqNum --> SpecWxFreqNum

Xeáp choàng töøng coät cuûa SpecWxFreqNum

theo tæ leä dòch SP ban ñaàu vaø Addcaùc vuøng Overlap laïi vôùi nhau

End

Matlab Code:

function ReconstructedSignal=OverlapAdd2(XNEW,yphase,windowLen,ShiftLen) %Y=OverlapAdd(X,A,W,S); %Y is the signal reconstructed signal from its spectrogram. X is a matrix %with each column being the fft of a segment of signal. A is the phase %angle of the spectrum which should have the same dimension as X. if it is %not given the phase angle of X is used which in the case of real values is %zero (assuming that its the magnitude). W is the window length of time %domain segments if not given the length is assumed to be twice as long as %fft window length. S is the shift length of the segmentation process ( for %example in the case of non overlapping signals it is equal to W and in the %case of %50 overlap is equal to W/2. if not given W/2 is used. Y is the %reconstructed time domain signal. %Sep-04 %Esfandiar Zavarehei if nargin<2 yphase=angle(XNEW); end if nargin<3 windowLen=size(XNEW,1)*2; end if nargin<4 ShiftLen=windowLen/2; end if fix(ShiftLen)~=ShiftLen ShiftLen=fix(ShiftLen); disp('The shift length have to be an integer as it is the number of samples.'); disp(['shift length is fixed to ' num2str(ShiftLen)]) end

Page 12: Spectral Subtraction and Wiener Filter

12

[FreqRes FrameNum]=size(XNEW); Spec=XNEW.*exp(j*yphase); if mod(windowLen,2) %if FreqResol is odd Spec=[Spec;flipud(conj(Spec(2:end,:)))]; else Spec=[Spec;flipud(conj(Spec(2:end-1,:)))]; end sig=zeros((FrameNum-1)*ShiftLen+windowLen,1); weight=sig; for i=1:FrameNum start=(i-1)*ShiftLen+1; spec=Spec(:,i); sig(start:start+windowLen-1)=sig(start:start+windowLen-1)+ real(ifft(spec,windowLen)); end ReconstructedSignal=sig;

2. Các thuật toán nâng cao chất lượng tiếng nói:

Sơ đồ tổng quát xử lý tiếng nói:

Hình 1.1 Sơ đồ khối cho hai thuật toán SS và WF

Cả 2 thuật toán Spectral subtraction và Wiener filter chỉ khác nhau ở khối hàm xử lý

giảm nhiễu, tất cả các khối còn lại thì giống nhau.

2.1. Thuật toán trừ phổ ( Spectral Subtraction – SS )

Thuật toán trừ phổ dựa trên một nguyên tắc cơ bản, thừa nhận sự có mặt của nhiễu,

và ước lượng phổ nhiễu rồi lấy phổ của tín hiệu tiếng nói bị nhiễu trừ đi phổ của nhiễu đã

ước lượng. Phổ của nhiễu có thể được ước lượng, cập nhật trong nhiều chu kỳ khi không

có mặt của tín hiệu tiếng nói. Phương pháp này chỉ được thực hiện đối với nhiễu không

đổi hoặc có tốc độ biến đổi chậm, và khi đó phổ của nhiễu sẽ không thay đổi đáng kể giữa

các khoảng thời gian cập nhật.

Gọi y[n] là tín hiệu vào đã bị nhiễu, nó là tổng của tín hiệu sạch s[n] và nhiễu n[n]:

y[n] = s[n] + n[n] (7)

Phân tích tín

hiệu thành các

frame

FFT

Ước lượng

nhiễu

Hàm xử lý

giảm nhiễu

Tín hiệu bị

nhiễu

IFFT Overlap

adding Tín hiệu

đã xử lý

Page 13: Spectral Subtraction and Wiener Filter

13

Windowing tín hiệu:

yw[n] = sw[n] + nw[n] (8)

Thực hiện biến đổi Fourier rời rạc cả 2 vế,ta được :

푌 (ω) = 푆 (ω) + 푁 (ω) (9)

Chúng ta có thể biểu diễn Y(ω) dưới dạng phổ phức như sau:

푌 (ω) = |푌 (ω)|푒푗ϕ푦(ω) (10)

Khi đó |푌 (ω)| là phổ biên độ, và ϕ (ω) là phổ pha của tín hiệu đã bị nhiễu.

Phổ của tín hiệu nhiễu 푁 (ω) có thể được biểu diễn dạng:

푁 (ω) = |푁 (ω)|푒푗ϕ푛(ω)

Bộ lọc trừ phổ được tính toán dựa trên cơ sở ( đề xuất bởi Boll79 [1] ): Biên độ phổ của

nhiễu |푁 (ω)| có thể được thay thế bằng giá trị trung bình của nó và được ước lượng

trong khi không có tiếng nói hoạt động ; Pha Φn(ω) của nhiễu 푁 (휔) được thay thế bằng

pha ϕ (ω)của tín hiệu có nhiễu 푌 (휔) ; Biên độ phổ nhiễu |푌 (ω)| được thay thế bằng

giá trị trung bình của nó trên segment đang xét |푌 (휔)| = ∑ |푌 (휔)| (11)

Khi đó chúng ta có thể ước lượng được phổ của tín hiệu sạch:

푆푤∧

(ω) = [|푌푤(ω)| − |푁푤∧

(ω)|]푒 ϕ (ω) (12)

Hoặc:

푆푤∧

(ω) = 푌푤(ω).퐺(ω) (13) Với:

G(ω) = 1− μ(ω)

|푌푤(ω)| (14)

μ(ω) ≜ |푁푤∧

(ω)| = E{ | 푁 (ω) | } (15)

Ở đây μ(ω)hay |푁푤∧

(ω)| là biên độ phổ ước lượng của nhiễu được tính trong khi

không có tiếng nói hoạt động. Ký hiệu "∧" để chỉ rằng giá trị đó là giá trị ước lượng gần

đúng, E{ ▪ } là toán tử kỳ vọng ( Expectation ) . Tín hiệu tiếng nói được tăng cường có

thể có được bằng cách biến đổi IFFT của 푆푤∧

(ω).

Page 14: Spectral Subtraction and Wiener Filter

14

Giả thiết nhiễu được xem là biến đổi chậm , thế thì biên độ phổ ước lượng của

nhiễu μ(ω) có thể được ước lượng bởi giá trị trung bình của tín hiệu vào trong tất cả các

frame/segment chỉ có nhiễu trên suốt chiều dài tín hiệu. Khi đó (15) có thể được viết lại

(theo [6] ):

휇(ω) ≅ 휇∧

(ω) = ∑| ( )| (16)

Cần chú ý rằng biên độ phổ của tín hiệu đã được tăng cường là |푆푤∧

(ω)| =

|푌푤(ω)| − |푁푤∧

(ω)| , có thể bị âm do sự sai sót trong việc ước lượng phổ của nhiễu. Tuy

nhiên, biên độ của phổ thì không thể âm, nên chúng cần phải đảm bảo rằng khi thực trừ

hai phổ thì phổ của tín hiệu tăng cường |푆푤∧

(ω)| luôn luôn không âm. Giải pháp được đưa

ra để khắc phục điều này là chỉnh lưu bán sóng hiệu của phổ, nếu thành phần phổ nào mà

âm thì chúng ta sẽ gán nó bằng 0:

|푆푤∧

(ω)| = |푌푤(ω)| − |푁푤^

(ω)|,|푌푤(ω)| > |푁푤^

(ω)|0, ≠

(17)

Đối với phổ công suất

Bình phương 2 vế của phương trình ( 9 ) ta được:

|푌푤(ω)| = |푆푤(ω)| + |푁푤(ω)| + 푆푤(ω).푁푤∗(ω) + 푆푤∗(ω)푁푤(ω)

= |푆푤(ω)| + |푁푤(ω)| + 2. Re{푆푤(ω)푁푤∗(ω)} (18)

|푁 (ω)|2, 푆 (ω).푁푤∗(ω) và 푆푤∗(ω).푁푤(ω) không thể tính được một cách

trực tiếp mà có thể lấy xấp xỉ bằng E{|푁 (ω)|2}, E{ 푆 (ω).푁 (ω)} và

E{푆푤∗(ω).푁푤(ω)}. Bình thường thì E{|푁 (ω)|2} được ước lượng khi không có tiếng nói

hoạt động và được biểu diễn là |푁푤∧

(ω)|2. Vì không có một sự tương quan nào giữa

nhiễu nw[n] và tín hiệu sạch sw[n] [1], nên E{ 푆 (ω).푁푤∗(ω)} và E{푆푤∗(ω).푁푤(ω)}

xem như bằng 0. Khi đó phổ công suất của tín hiệu sạch có thể tính được như sau:

|푆푤^

(ω)| = |푌푤(ω)| − |푁푤^

(ω)| (19)

Công thức trên biểu diễn thuật toán trừ phổ công suất. Theo đó, thì phổ công suất

được ước lượng |푋푤∧

(ω)| không được đảm bảo luôn là một số dương, nhưng có thể sử

Page 15: Spectral Subtraction and Wiener Filter

15

dụng phương pháp chỉnh lưu nửa sóng như đã trình bày ở trên. Tín hiệu được tăng cường

sẽ thu được bằng cách tính IFFT của |푋푤∧

(ω)| (bằng cách lấy căn bậc hai của |푋푤∧

(ω)|2 ), có sử dụng pha của tín hiệu tiếng nói bị nhiễu. Công thức hàm độ lợi 퐺(ω) có thể được viết theo dạng sau:

|푆푤^

(ω)| = 퐺 (ω)|푌푤(ω)| ( 20)

Khi đó: 퐺(ω) = 1 − |푁푤^

(ω)||푌푤(ω)|

(21)

Trường hợp tổng quát thì thuật toán trừ phổ có thể được biểu diễn:

|푋푤^

(ω)|γ = |푌푤(ω)|γ − |푁푤^

(ω)|γ (22)

Với 훾 = 1 là đó là phương pháp trừ phổ biên độ điển hình, 훾 = 2 là phương pháp trừ phổ

công suất.

Page 16: Spectral Subtraction and Wiener Filter

16

Spectral Sub traction

Segmen t

FFT

T ính trung bình bieân ñoä/C .sua át

iteration = 1

VAD algorithm

SpeechFlag = 0 ?

Caäp nha ät va ø la øm trôn nhieãu Trö ø phoå

Caäp nha ät nhieãu dö

Suy gia ûm tín hieäu -30 dB

G ia ûm nhieãu dö

Chænh löu nöûa soùng

iteration + +

iterat ion > NumOfSegme nts ?

IFFT

OverlapAddin g

End

S

Ñ

S

Ñ

y[n]

s[n]

Matlab Code:

function [output,Speech]=SSBoll79(signal,fs,IS) % OUTPUT=SSBOLL79(S,FS,IS) % Spectral Subtraction based on Boll 79. Amplitude spectral subtraction

Page 17: Spectral Subtraction and Wiener Filter

17

% Includes Magnitude Averaging and Residual noise Reduction % % INPUT: Signal is the noisy signal, fs is the sampling frequency and IS is the initial % silence (noise only) length in seconds (default value is .25 sec) % % OUTPUT: output is enhanced speech signal; Speech is VAD vector % % April-05 % Esfandiar Zavarehei if (nargin<3 | isstruct(IS)) IS=.25; %seconds end W=fix(.025*fs); %Window length is 25 ms nfft=W; SP=.4; %Shift percentage is 40% (10ms) %Overlap-Add method works good with this value(.4) wnd=hamming(W); % wnd=rectwin(W); % IGNORE THIS SECTION FOR CAMPATIBALITY WITH ANOTHER PROGRAM FROM HERE..... if (nargin>=3 & isstruct(IS))%This option is for compatibility with another programme W=IS.windowsize SP=IS.shiftsize/W; nfft=IS.nfft; wnd=IS.window; if isfield(IS,'IS') IS=IS.IS; else IS=.25; end end % .......IGNORE THIS SECTION FOR CAMPATIBALITY WITH ANOTHER PROGRAM T0 HERE NIS=fix((IS*fs-W)/(SP*W) +1);%number of initial silence segments ( Eq 2) Gamma=1;% (1 for magnitude spectral subtraction, 2 for power spectrum subtraction) disp(' Segmentation'); y=segment(signal,W,SP,wnd); disp(' FFT'); Y=fft(y,nfft); YPhase=angle(Y(1:fix(end/2)+1,:)); %Noisy Speech Phase Y=abs(Y(1:fix(end/2)+1,:)).^Gamma;%Specrogram numberOfFrames=size(Y,2); FreqResol=size(Y,1); %size(Y), disp(' Noise Initialization'); N=mean(Y(:,1:NIS)')'; %initial Noise Power Spectrum mean NRM=zeros(size(N));% Noise Residual Maximum (Initialization) NoiseCounter=0; NoiseLength=9;%This is a smoothing factor for the noise updating Beta=.03; % ( Eq 6 ) disp(' Magnitude Averaged'); YS=Y; %Y Magnitude Averaged for i=2:(numberOfFrames-1)

Page 18: Spectral Subtraction and Wiener Filter

18

YS(:,i)=(Y(:,i-1)+Y(:,i)+Y(:,i+1))/3; % ( Eq 11 ) end disp(' Spectral Subtraction'); X=zeros(FreqResol,numberOfFrames); for i=1:numberOfFrames [NoiseFlag, SpeechFlag, NoiseCounter, Dist]=vad(Y(:,i).^(1/Gamma),N.^(1/Gamma),NoiseCounter); %Magnitude Spectrum Distance VAD Speech(i,1)=SpeechFlag; if SpeechFlag==0 N=(NoiseLength*N+Y(:,i))/(NoiseLength+1); %Update and smooth noise ( Eq 15 ) NRM=max(NRM,YS(:,i)-N);%Update Maximum Noise Residue ( Eq 4 ) X(:,i)=Beta*Y(:,i); % ( Eq 6 ) else D=YS(:,i)-N; % Specral Subtraction ( Eq 12 ) if i>1 && i<numberOfFrames %Residual Noise Reduction for j=1:length(D) if D(j)<NRM(j) D(j)=min([D(j) YS(j,i-1)-N(j) YS(j,i+1)-N(j)]); % ( Eq 5 ) end end end X(:,i)=max(D,0); % ( Eq 3 ) end end disp(' Synthesis'); output=OverlapAdd2(X.^(1/Gamma),YPhase,W,SP*W);

2.2. Thuật toán Wiener Filter ( WF )

Nguồn gốc cơ bản của thuật toán WF là ước lượng tín hiệu tiếng nói bằng cách tối

thiểu hóa sai số bình phương trung bình (Mean Square Error) giữa tín hiệu tiếng nói thực

và tín hiệu tiếng nói được ước lượng.

Giả thiết rằng y[n] là tín hiệu vào đã bị nhiễu, nó là tổng của tín hiệu sạch s[n] và tín

hiệu nhiễu n[n]:

y[n]=s[n]+n[n] (23)

Windowing tín hiệu:

yw[n] = sw[n] + nw[n] (24)

Thực hiện biến đổi Fourier rời rạc cả 2 vế :

푌 (ω) = 푆 (ω) + 푁 (ω) (25)

Biểu diễn Y(ω) dưới dạng phức :

Page 19: Spectral Subtraction and Wiener Filter

19

푌 (ω) = |푌 (ω)|푒푗ϕ푦(ω) (26)

Với |Y(ω)| là phổ biên độ, và ϕ (ω)là phổ pha của tín hiệu có nhiễu.

Phổ của tín hiệu nhiễu N(ω) có thể được biểu diễn dạng biên độ và pha:

푁 (ω) = |푁 (ω)|푒푗ϕ푛(ω) (27)

Biên độ phổ của nhiễu |N(ω)| không xác định được, nhưng có thể thay thế bằng giá trị

trung bình của nó được tính trong khi không có tiếng nói (tiếng nói bị dừng), và pha của

tín hiệu nhiễu có thể thay thế bằng pha của tín hiệu bị nhiễu ϕ (ω).

Ta có thể ước lượng được biên độ của phổ tín hiệu sạch 푆푤∧

(ω) từ Yw(ω) bằng một hàm

phi tuyến được xác định như sau :

푆푤∧

(ω) = 푌푤(ω).퐺(ω) (28)

퐺(ω) = 1 −∧

(ω)|푌푤(ω)|

(29)

Định nghĩa Priori SNR và Posteriori SNR như sau:

푆푁푅 = ξ ≜ {|푆푤(ω)| }

{|푁푤(ω)| } (30)

푆푁푅 = γ ≜ |푌푤(ω)|

{|푁푤(ω)| } (31)

SNR (ω) = | (ω)|(ω)

(32)

SNR (ω) = (1 − α). max SNR (ω) − 1,0 + α. (ω)| .| (ω)(ω)

(33)푁표푡푒:푖đểchỉSegmenthiệntại(푖 − 1)đểchỉSegmenttrướcđó

Với: 퐸{|푁푤(ω)| } ≅휆∧

(ω) = 1M

∑|Yi(ω)|2

Mnoise−onlyFrames (34)

Ta định nghĩa thêm instantaneous SNR [4]:

푆푁푅 = ϑ ≜ |푌푤(ω)| {|푁푤(ω)| }{|푁푤(ω)| }

= SNR − 1 (35)

Để khảo sát quan hệ giữa SNRpri và SNRpost .Ta giả sử đã biết trước tín hiệu sạch và nhiễu,

thế thì một local Priori SNR và local Posteriori SNR định nghĩa như sau ( theo [4]):

Page 20: Spectral Subtraction and Wiener Filter

20

푆푁푅 = |푌푤(ω)||푁푤(ω)|

(36) và 푆푁푅 = |푆푤(ω)||푁푤(ω)|

(37)

Từ thay thế (36) và (37) vào phương trình (18) ta có:

푆푁푅 = 1 + 푆푁푅 + 2. 푆푁푅 . cos(훼(휔)) (38)

Khảo sát mối quan hệ của các SNRs theo hướng tiếp cận của thuật toán Decision-Directed

như ở phương trình (32) và (33) :

Theo Steven Boll79 [1], vì không có một sự tương quan nào giữa nhiễu nw[n] và tín

hiệu sạch sw[n] nên cos( α(ω) ) = 0 hay α(ω) = π/2 , và theo phương trình (12) (trong [4])

thì:

SNRpri = SNRpost – 1 = SNRinst

Kết quả phương trình trên cũng được đề xuất bởi Scalart96 [2]. Cuối cùng ta được:

SNRpost = 1 + SNRpri (39)

Từ đó gain function 퐺(ω) của WF ( bởi Scalart96 ) được xác định như sau :

퐺(ω) =

(40)

Hoặc biểu diễn G(ω) thông qua SNRpost :

퐺(ω) =

(41)

Xây dựng thuật toán cho Wiener Filter :

Page 21: Spectral Subtraction and Wiener Filter

21

WienerFiltering

Segment

FFT

Tính coâng suaát nhieãutrung bình ban ñaàu

iteration = 1

VAD algorithm

S peechFlag = 0 ? Caäp nhaät vaø laøm trôn bieân ñoävaø phöông sai cuûa nhieãu

Tính po steriori SN R vaø priori SNR

Tính Gain function ( G )G = S NRpri /( SNR pri + 1 )

Öôùc löôïng tín hieäu saïch S[k] = G .* Y[k]

iteration + +

iteration > N umOfS egments

IFFT

OverlapAdding

End

S

Ñ

S

Ñ

y[n]

s[n]

Matlab Code:

Page 22: Spectral Subtraction and Wiener Filter

22

function [output,Speech]=WienerScalart96(signal,fs,IS) % output=WIENERSCALART96(signal,fs,IS) % Wiener filter based on tracking a priori SNR using Decision-Directed % method, proposed by Scalart et al 96. In this method it is assumed that % SNRpost=SNRprior +1. based on this the Wiener Filter can be adapted to a % model like Ephraims model in which we have a gain function which is a % function of a priori SNR and a priori SNR is being tracked using Decision % Directed method. % % INPUT: Signal is the noisy signal, fs is the sampling frequency and IS is the initial % silence (noise only) length in seconds (default value is .25 sec) % % OUTPUT: output is enhanced speech signal; Speech is VAD vector % % Author: Esfandiar Zavarehei % Created: MAR-05 if (nargin<3 | isstruct(IS)) IS=.25; %Initial Silence or Noise Only part in seconds end W=fix(.025*fs); %Window length is 25 ms SP=.4; %Shift percentage is 40% (10ms) %Overlap-Add method works good with this value(.4) wnd=hamming(W); %IGNORE FROM HERE ............................... if (nargin>=3 & isstruct(IS))%This option is for compatibility with another programme W=IS.windowsize SP=IS.shiftsize/W; %nfft=IS.nfft; wnd=IS.window; if isfield(IS,'IS') IS=IS.IS; else IS=.25; end end % ......................................UP TO HERE % pre_emph=0; % signal=filter([1 -pre_emph],1,signal); NIS=fix((IS*fs-W)/(SP*W) +1);%number of initial silence segments ( Eq 2) disp(' Segmentation'); y=segment(signal,W,SP,wnd); % This function chops the signal into frames disp(' FFT'); Y=fft(y); YPhase=angle(Y(1:fix(end/2)+1,:)); %Noisy Speech Phase Y=abs(Y(1:fix(end/2)+1,:)); %Specrogram numberOfFrames=size(Y,2); FreqResol=size(Y,1); disp(' Noise Initialization'); N=mean(Y(:,1:NIS)')'; %initial Noise Power Spectrum mean

Page 23: Spectral Subtraction and Wiener Filter

23

LambdaD=mean((Y(:,1:NIS)').^2)';%initial Noise Power Spectrum variance alpha=.99; %used in smoothing xi (For Deciesion Directed method for estimation of A Priori SNR) NoiseCounter=0; NoiseLength=9; %This is a smoothing factor for the noise updating G=ones(FreqResol,1);%Initial Gain used in calculation of the new xi Gamma=ones(FreqResol,1);%Initial A posteriori SNR used in calculation of the new xi X=zeros(size(Y)); % Initialize X (memory allocation) % h=waitbar(0,'Wait...'); disp(' Wiener Filter'); for i=1:numberOfFrames %%%%%%%%%%%%%%%%VAD and Noise Estimation START if i<=NIS % If initial silence ignore VAD SpeechFlag=0; NoiseCounter=100; else % Else Do VAD [NoiseFlag, SpeechFlag, NoiseCounter, Dist]=vad(Y(:,i),N,NoiseCounter); %Magnitude Spectrum Distance VAD end if SpeechFlag==0 % If noise only frame then update noise parameters N=(NoiseLength*N+Y(:,i))/(NoiseLength+1); %Update and smooth noise mean ( Eq 15 ) LambdaD=(NoiseLength*LambdaD + (Y(:,i).^2))./(1+NoiseLength); %Update and smooth noise variance ( Eq 34 ) end %%%%%%%%%%%%%%%%%%% VAD and Noise Estimation END Speech(i,1)=SpeechFlag; gammaNew = (Y(:,i).^2)./LambdaD; % A posteriori SNR at current frame i ( Eq 32 ) xi = (1-alpha).*max(gammaNew-1,0) + alpha*(G.^2).*Gamma; % A Priori SNR % estimate at current frame i based on Decision Directed Method ( Eq 33 ) Gamma = gammaNew; % if(i==1) % xi = (1-alpha).*max(gammaNew-1,0) + alpha*(G.^2).*Gamma; % else % xi = (1-alpha).*max(gammaNew-1,0) + alpha*((G.*Y(:,i- 1)).^2)./LambdaD; % end G = xi./(xi+1) ; % ( Eq 40 ) X(:,i)=G.*Y(:,i); %Obtain the new Cleaned value ( Eq 28 ) % waitbar(i/numberOfFrames,h,num2str(fix(100*i/numberOfFrames))); end % close(h); disp(' Synthesis'); output=OverlapAdd2(X,YPhase,W,SP*W); %Overlap-add Synthesis of speech % output=filter(1,[1 -pre_emph],output); %Undo the effect of Pre-emphasis % output=0.999*(output/max(abs(output)));

Page 24: Spectral Subtraction and Wiener Filter

24

2.3. Phát triển thuật toán Spectral Subtraction từ thuật toán Wiener Filtering :

Từ biểu thức trừ phổ công suất cho bởi thuật toán SS ( bởi Boll79 ) :

|푆푤∧

(ω)| = 퐺 (ω). |푌푤(ω)|2 = |푌푤(ω)|2 − 푁푤∧

(ω)

→ 퐺(ω) = 1−푁푤∧

(ω)

|푌푤(ω)|2 = 1− 1SNRpost

= SNRpost−1SNRpost

( 42 )

Ta có thể biểu diễn Gain function thông qua tỉ số SNRpri , theo phương trình (39) thì

SNRpri = SNRpost – 1, vì thế:

퐺(ω) =

( 43 )

Thuật toán SS có thể được thể hiện thông qua tỉ số tín hiệu SNRpri cho bởi phương trình

( 43 ) và lưu đồ thuật toán của nó như sau:

Page 25: Spectral Subtraction and Wiener Filter

25

SS_based_on_WF

Segment

FFT

Tính coâng sua át nhieãutrung bình ban ñaàu

iteration = 1

VAD algorithm

S peechFlag = 0 ? Caäp nhaät vaø la øm trôn bieân ñoävaø phöông sai c uûa nhieãu

Tính pr iori SNR

Gain functionG = sqrt( SNR pri /( SNRpr i + 1 ) )

Öôùc löôïng t ín hieäu saïch S[k] = G .* Y[k]

iteration + +

iteration > N umOfS egments

IFFT

OverlapAdding

End

S

Ñ

S

Ñ

s[n]

P owExp = 1 : tröø ph oå bieân ñoäPowExp = 2 : trö ø phoå coâng suaát

y[n]

Page 26: Spectral Subtraction and Wiener Filter

26

Matlab Code: function [output,Speech]=SSBasedOnWF (signal,fs,IS) % output= SSBasedOnWF(signal,fs,IS) % "A Parametric Formulation of the Generalized Spectral Subtraction Method" if (nargin<3 | isstruct(IS)) IS=.25; %Initial Silence or Noise Only part in seconds end W=fix(.025*fs); %Window length is 25 ms SP=.4; %Shift percentage is 40% (10ms) %Overlap-Add method works good with this value(.4) wnd=hamming(W); %IGNORE FROM HERE ............................... if (nargin>=3 & isstruct(IS))%This option is for compatibility with another programme W=IS.windowsize SP=IS.shiftsize/W; %nfft=IS.nfft; wnd=IS.window; if isfield(IS,'IS') IS=IS.IS; else IS=.25; end end % ......................................UP TO HERE % pre_emph=0; % signal=filter([1 -pre_emph],1,signal); NIS=fix((IS*fs-W)/(SP*W) +1);%number of initial silence segments PowExp=1;% (1 for magnitude spectral subtraction, 2 for power spectrum subtraction) y=segment(signal,W,SP,wnd); % This function chops the signal into frames Y=fft(y); YPhase=angle(Y(1:fix(end/2)+1,:)); %Noisy Speech Phase Y=abs(Y(1:fix(end/2)+1,:)).^PowExp;%Specrogram numberOfFrames=size(Y,2); FreqResol=size(Y,1); N=mean((Y(:,1:NIS)').^(1/PowExp))'; %initial Noise Power Spectrum mean LambdaD=mean((Y(:,1:NIS)').^(2/PowExp))';%initial Noise Power Spectrum variance alpha=.99; %used in smoothing xi (For Deciesion Directed method for estimation of A Priori SNR) NoiseCounter=0; NoiseLength=9;%This is a smoothing factor for the noise updating G=ones(FreqResol,1);%Initial Gain used in calculation of the new xi InitialGamma=ones(FreqResol,1);%Initial A posteriori SNR used in calculation of the new xi X=zeros(size(Y)); % Initialize X (memory allocation) % h=waitbar(0,'Wait...'); for i=1:numberOfFrames %%%%%%%%%%%%%%%%VAD and Noise Estimation START

Page 27: Spectral Subtraction and Wiener Filter

27

if i<=NIS % If initial silence ignore VAD SpeechFlag=0; NoiseCounter=100; else % Else Do VAD [NoiseFlag, SpeechFlag, NoiseCounter, Dist]=vad(Y(:,i).^(1/PowExp),N,NoiseCounter); %Magnitude Spectrum Distance VAD end if SpeechFlag==0 % If not Speech Update Noise Parameters N=(NoiseLength*N+Y(:,i).^(1/PowExp))/(NoiseLength+1); %Update and smooth noise mean ( Eq 15 ) LambdaD=(NoiseLength*LambdaD +Y(:,i).^(2/PowExp)))./(1+NoiseLength); %Update and smooth noise variance( Eq 34 ) end Gamma = (Y(:,i).^(2/PowExp)./ LambdaD); if i>1 xi = ((1-alpha).*max(Y(:,i).^(2/PowExp) - LambdaD,0) + alpha*X(:,i-1).^(2/PowExp)) ./ LambdaD; % Spectral Subtraction & estimate xi else xi = (1-alpha).*max(Gamma - 1,0) + alpha*(G.^2).*InitialGamma ; end G = sqrt(xi./(xi+1)); X(:,i) = G.* Y(:,i); % waitbar(i/numberOfFrames,h,num2str(fix(100*i/numberOfFrames))); end % close(h); output=OverlapAdd2(X.^(1/PowExp),YPhase,W,SP*W); %Overlap-add Synthesis of speech % output=filter(1,[1 -pre_emph],output); %Undo the effect of Pre-emphasis

3. Kiểm tra thuật toán với mẫu tín hiệu audio đã cho:

Thực hiện kiểm tra thuật toán dựa trên tiêu chí đánh giá cảm quan như sau:

CCR (Comparison Category Rate)

-3 -2 -1 0 1 2 3

Much worse

Worse Slightly worse

About the same

Slightly better

Better Much better

File âm thanh sp01VN_babble_sn5.wav : tín hiệu có nhiễu là tiếng ồn gây ra do

đám đông, tỉ số công suất tín hiệu trên công suất nhiễu là 5 dB.

File âm thanh sp01VN_white_sn5.wav : tín hiệu có nhiễu là tiếng ồn gây ra bởi

nhiễu trắng, phân bố Gauss, và SNR là 5 dB.

Nội dung:

“ Một số nhân viên làm việc cho chương trình con thoi của Nasa ”

Page 28: Spectral Subtraction and Wiener Filter

28

Speech Enhencement với thuật toán SS :

i. Xét file âm thanh sp01VN_babble_sn5.wav :

(a) Tín hiệu sạch (b) Tín hiệu bị nhiễu (c) Tín hiệu tăng cường bởi thuật toán SS với posteriori SNR (d) Tín hiệu tăng cường bởi thuật toán SS với priori SNR

ii. Xét file âm thanh sp01VN_white_sn5.wav :

(a) Tín hiệu sạch (b) Tín hiệu bị nhiễu (c) Tín hiệu tăng cường bởi thuật toán SS với posteriori SNR

Page 29: Spectral Subtraction and Wiener Filter

29

(d) Tín hiệu tăng cường bởi thuật toán SS với priori SNR

Speech Enhencement với thuật toán WF :

i. Xét file âm thanh sp01VN_babble_sn5.wav :

(a) Tín hiệu sạch (b) Tín hiệu bị nhiễu (c) Tín hiệu tăng cường bởi thuật toán WF với priori SNR (d) Tín hiệu tăng cường bởi thuật toán WF với posteriori SNR

ii. Xét file âm thanh sp01VN_white_sn5.wav :

Page 30: Spectral Subtraction and Wiener Filter

30

(a) Tín hiệu sạch (b) Tín hiệu bị nhiễu (c) Tín hiệu tăng cường bởi thuật toán WF với priori SNR (d) Tín hiệu tăng cường bởi thuật toán WF với posteriori SNR

Tổng hợp ý kiến đánh giá tín hiệu sau khi đã xử lý so với tín hiệu trước khi xử lý

chỉ đạt – 1 điểm. Có thể do cập nhật nhiễu chưa đúng nên kết quả xử lý chưa được

tốt. Do vậy cần thay đổi một vài thông số trong đoạn code để cải thiện chất lượng

xử lý.

4. Các thông số ảnh hưởng đến hiệu quả chất lượng của thuật toán:

4.1. Các thông số chung ảnh hưởng đến cả 2 thuật toán:

SP ( Shift Percentage ): là độ dịch khi chia tín hiệu ra từng Segment. Nếu SP không

thích hợp thì khi cộng gộp các Segments lại sẽ gây ra hiện tượng méo dạng.

IS ( Initial Silence ): là khoảng im lặng ban đầu. Nếu IS quá lớn thì có thể xảy ra

trường hợp tiếng nói ban đầu cũng bị xem là nhiễu. Nếu IS quá nhỏ thì lượng nhiễu

cập nhật ban đầu bị thiếu.

NoiseMargin và Hangover: là các thông số để quyết định 1 Segment là nhiễu hay

tiếng nói. Nếu một Segment bị đánh giá sai thì nhiễu cập nhật sẽ bị sai, do đó kết

quả sẽ bị ảnh hưởng.

4.2. Các thông số ảnh hưởng đến thuật toán Spectral Subtraction:

NoiseLength: hệ số làm trơn cho quá trình cập nhật nhiễu

Gamma ( PowExp ): hệ số dùng để chọn thuật toán là trừ phổ biên độ hay trừ phổ

công suất

4.3. Các thông số ảnh hưởng đến thuật toán Wiener:

alpha: là hệ số làm trơn cho SNRpriori

5. Cải thiện chất lượng:

Thay đổi các thông số chung của cả hai thuật toán để cải thiện chất lượng thông qua

phương pháp đánh giá cảm quan bằng tai.

Chọn cửa sổ Hamming

SP = 0.5

IS= 0.15

NoiseMargin=3

Hangover=4

Page 31: Spectral Subtraction and Wiener Filter

31

Gamma=1

Beta=0.02

alpha=0.95

6. Nhận xét và kết luận.

6.1. Nhận xét.

- Ở môi trường có SNR thấp thì phần tiếng bị mất nhiều, nhiều lúc bị ngắt quảng

do nén quá lớn.

- Ở môi trường SNR lớn nhiễu được nén triệt để hơn nhưng vẫn giữ được chất

lượng tiếng nói.

- Ở phương pháp Wiener Filter phần tiếng được khuếch đại lớn hơn so với phương

pháp trừ phổ nên có cảm giác nhiễu ít hơn.

6.2. Kết luận.

- Với môi trường có SNR càng lớn, chất lượng tín hiệu sau khi xử lý càng tốt.

- Trong 2 phương pháp thì thuật toán Wiener tối ưu hơn so với phương phát trừ phổ

tín hiệu.

Tài liệu tham khảo : [1] Steven F.Boll, Member, IEEE, “Suppression of Acoustic Noise in Speech Using

Spectral Subtraction” , 1979.

[2] Pascal Scalart, IEEE “Speech Enhancement based on A Priori Signal to Noise

estimation”, 1996.

[3] JAE S. Lim, Member, IEEE, “Enhancement and Bandwidth Compression of Noisy

Speech”, 1979.

[4] Cyril Plapous, Claude Marro, and Pascal Scalart, Member, IEEE, “Improved Signal-

to-Noise Ratio Estimation for Speech Enhancement”, 2006

[5] Tuan V. Pham, DUT, “Wavelet Analysis For Robust Speech Processing and

Applications” , 2008.

[6] Tuan V. Pham, DUT, “Speech Enhancement” Slides, Summer 2009.

Page 32: Spectral Subtraction and Wiener Filter

32

[7] Saeed V. Vaseghi, Brunel university, UK ,“Advanced Digital Signal Processing and

Noise Reduction 2nd Edition”, Copyright © 2000 by John Wiley & Sons, Ltd.

[8] Richard C. Hendriks, Richard Heusdens and Jesper Jensen, “Forward-Backward

decision directed approach for Speech Enhancement”, Delft University of Technology,

Dept. of Mediamatics, 2628 CD Delft, The Netherlands.

[9] Peter Vary, Rainer Martin, “Digital Speech Transmission”, Copyright © 2006.