intTypePromotion=3

Chất lượng tiếng nói

Chia sẻ: Dgfdfgo Dkfgdkg | Ngày: | Loại File: PDF | Số trang:32

0
64
lượt xem
10
download

Chất lượng tiếng nói

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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...

Chủ đề:
Lưu

Nội dung Text: Chất lượng tiếng nói

  1. ng SPEECH ENHENCEMENT ALGORITHMS FINAL PROJECT JUN-2012, DUT oa ELECTRONICS AND TELECOMMUNICATION ENGINEERING DIGITAL SIGNAL PROCESSING .H MAIN REPORT M ao Author Th Hoàng Minh Thảo langtu2790@gmail.com 1
  2. ng 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 oa 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. .H Phân tích tín hiệu có nhiễu thành các segment/frame : 1.1. 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à M 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”. ao Th 2
  3. ng oa .H 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)) ) . M 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 = ao (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 Th 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. 3
  4. Thuật toán phân đoạn tín hiệu: ng Se gment Window,signal --> Vect or coä t #SP samples: #SP = [ W * S P ] oa #Segments: N = [ (L-W)/ (#SP )+ 1 ] [.] : l aáy phaàn nguyeâ n [1:W] --> M1 = [(1:W); (1:W); ...;(1:W )]NxW Copy Copy [1:(N -1)]' --> M2 = #SP *[(0: N-1)' ,(0:N -1)',...,(0: N-1)' ]NxW [1:W] --> hw = [(1:W)' ,(1:W)' ,...,(1:W) ']WxN Copy .H Tính m a t raän Index In dexWxN =( M1 + M2 ) ' Tí nh ma traän segment Seg = signal(Ind ex).*hw M End Matlab Code: function Seg=segment(signal,W,SP,Window) ao % 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 Th % Esfandiar Zavarehei if nargin
  5. Window=hamming(W); end ng 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 oa 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 .H â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. M ao Th 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) 5
  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% . ng 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 oa 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. .H M 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 ao 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 Th 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. 6
  7. VA D ng Tí nh khoaû ng caùch phoå cuûa segment/ frame ñang xeù t SpectralD ist = max( 20*lg(signal) - 20*lg(noi se)), 0 ) T ính giaù t rò trung bình c uûa Spec tralD ist Dist = Spec tralDist / length(Spec tralD ist) oa S Di st < khoaûng c aùch phoå ngöôõ ng ? Ñ .H No ise Flag = 1 Nois eFlag = 0 Noi seCou nter + + NoiseCounter = 0 S M NoiseCoun ter > Soá segment l ieâ n ti eáp (ngöôõ ng) ñeå quy ñònh laø nhieãu ? Ñ Sp eechFlag = 0 SpeechFlag = 1 ao En d Matlab Code: Th 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), 7
  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 ng %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
  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 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 ). oa ∧ ( ) | ( ) | (ω) = (ω). (ω) = = max (G(ω), 0) (ω) với (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ó .H tiếng nói hoạt động. Việc giảm nhiễu dư thực hiện như sau: ∧ ∧ | (ω)| , nếu | (ω)| ≥ |NR (ω)| ∧ | (ω)| = (5) ∧ ∧ min | (ω)| j = i − 1, i , i + 1 , nếu | (ω)| < |NR (ω)| 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 M đị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 | (ω)| = (6) ao ∧ . | (ω)|, < 12 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 Th 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. 9
  10. ng oa .H Quá trình xử lý tín hiệu tiếng nóiuá Mô tả xây dựng phương thức OverlapAdding : M ao Th Từ đó ta xây dựng lưu đồ thuật toán như sau: 10
  11. Overlap Add 2 ng Khoâi phuïc Spectrogr am c uûa tí n hi eäu vôù i ñaày ñuû bieâ n ñ oä vaø pha Spec 1/2WxFreqNum = Xnew . e^(j.Yphas e) Freq Num = soá coä t cuû a S pec oa Khoâ i phuï c moä t nöõa li eân hôïp phöùc ñoá i xöùng c uûa Spec 1/2WxF reqNum Spec 1/2WxF reqNum --> Spec WxF reqNum Xeá p choàng t öøng coä t cuû a Spec WxF reqNum theo t æ leä dòch SP ban ñaàu vaø Ad d .H caùc vuø ng Overl ap l aïi vôù i nhau End Matlab Code: function ReconstructedSignal=OverlapAdd2(XNEW,yphase,windowLen,ShiftLen) %Y=OverlapAdd(X,A,W,S); M %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 ao %Esfandiar Zavarehei if nargin
  12. [FreqRes FrameNum]=size(XNEW); Spec=XNEW.*exp(j*yphase); ng 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 oa 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; .H 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: Phân tích tín Overlap Hàm xử lý FFT IFFT hiệu thành các adding giảm nhiễu Tín hiệu frame M đã xử lý Tín hiệu bị Ước lượng nhiễu nhiễu 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ý ao 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 Th 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) 12
  13. Windowing tín hiệu: yw[n] = sw[n] + nw[n] (8) ng 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) oa (ω)| là phổ biên độ, và ϕ (ω) là phổ pha của tín hiệu đã bị nhiễu. Khi đó | (ω) có thể được biểu diễn dạng: Phổ của tín hiệu nhiễu ϕ (ω) (ω) = | (ω)| 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 .H nhiễu | (ω)| có thể được thay thế bằng giá trị trung bình của nó và được ước lượng ( ) được thay thế bằng trong khi không có tiếng nói hoạt động ; Pha Φn(ω) của nhiễu ( ) ; Biên độ phổ nhiễu | pha ϕ (ω) của tín hiệu có 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: M ∧ ∧ ϕ ( ω) (ω) = [| (ω)| − | (ω)|] (12) Hoặc: ∧ (ω) = (ω). (ω) (13) Với: μ ( ω) G(ω) = 1 − (14) ao | ( ω) | ∧ μ(ω) ≜ | (ω)| = E{ | (ω) | } (15) ∧ Ở đây μ(ω) hay | (ω)| là biên độ phổ ước lượng của nhiễu được tính trong khi Th "∧" để chỉ rằng giá trị đó là giá trị ước lượng gần không có tiếng nói hoạt động. Ký hiệu đú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 13
  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 ng 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à | (ω)| = oa ∧ | (ω)| − | (ω)| , 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à .H âm thì chúng ta sẽ gán nó bằng 0: ^ ^ ∧ (ω)| = | (ω)| − | (ω)| , | (ω)| > | (ω)| | ( 17) 0 , ≠ Đối với phổ công suất M Bình phương 2 vế của phương trình ( 9 ) ta được: (ω)| + (ω) . ∗ (ω) + ∗ (ω) | (ω)| = | (ω)| + | (ω) (18) (ω)| + 2. Re{ (ω) ∗ (ω)} = | (ω)| + | ∗ ∗ (ω)|2, (ω) và (ω). (ω) không thể tính được một cách (ω). | (ω)|2}, E{ (ω)} và trực tiếp mà có thể lấy xấp xỉ bằng (ω). E{| ao ∗ (ω)|2} được ước lượng khi không có tiếng nói (ω). (ω)}. Bình thường thì E{| E{ ∧ (ω)|2. Vì không có một sự tương quan nào giữa hoạt động và được biểu diễn là | ∗ ∗ (ω)} và E{ (ω). (ω)} nhiễu nw[n] và tín hiệu sạch sw[n] [1], nên 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: Th ^ ^ | (ω)| = | (ω)| − | (ω)| (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ử 14
  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 ∧ ∧ (ω)|2 ), 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 | ng 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) ^ | ( ω) | (ω) = 1− Khi đó: (21) oa | ( ω) | Trường hợp tổng quát thì thuật toán trừ phổ có thể được biểu diễn: ^ ^ γ γ (ω)|γ | (ω)| = | (ω)| − | (22) = 1 là đó là phương pháp trừ phổ biên độ điển hình, = 2 là phương pháp trừ phổ Vớ i .H công suất. M ao Th 15
  16. S p e ct r a l Sub tr a ct i o n y[n ] ng Se g m e n t F FT T ín h t ru n g b ì n h b ie â n ñ o ä /C . su a á t oa i te r a ti o n = 1 V A D a l g o ri t h m .H S S pe e c h F l a g = 0 ? Ñ T rö ø pho å Ca ä p n h a ät v a ø l a øm t rô n n h i e ãu C aä p n h a ät n h ie ã u d ö G ia û m n h i e ãu d ö M Su y g ia û m t ín h i e äu - 3 0 d B Ch æ n h l ö u n ö ûa s o ù n g it e r a ti o n + + S it e ra t i o n > N u m O f Se g m e nt s ? ao Ñ IF F T O v e r la p A d di n g Th s [n ] E nd Matlab Code: function [output,Speech]=SSBoll79(signal,fs,IS) % OUTPUT=SSBOLL79(S,FS,IS) % Spectral Subtraction based on Boll 79. Amplitude spectral subtraction 16
  17. % Includes Magnitude Averaging and Residual noise Reduction % % INPUT: Signal is the noisy signal, fs is the sampling frequency and IS is ng 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))%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 M 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); ao 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), Th 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) 17
  18. YS(:,i)=(Y(:,i-1)+Y(:,i)+Y(:,i+1))/3; % ( Eq 11 ) end ng 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; oa 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
  19. ϕ ( ω) (ω) = | (ω)| (26) Với |Y(ω)| là phổ biên độ, và ϕ (ω)là phổ pha của tín hiệu có nhiễu. ng 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 oa tín hiệu nhiễu có thể thay thế bằng pha của tín hiệu bị nhiễu ϕ (ω). ∧ (ω) từ Yw(ω) bằng một hàm Ta có thể ước lượng được biên độ của phổ tín hiệu sạch phi tuyến được xác định như sau : ∧ (ω) = (ω). (ω) (28) .H ∧ (ω) (ω) = 1 − (29) | (ω)| Định nghĩa Priori SNR và Posteriori SNR như sau: {| (ω)| } = ξ ≜ (30) {| (ω)| } | ( ω) | = γ ≜ (31) {| (ω)| } M | (ω)| SNR (ω) = (32) ( ω) (ω)| . | ( ω) (1 − α). max SNR (ω) − 1,0 + α. SNR (ω) = (33) ( ω) : để chỉ Segment hiện tại ao ( − 1) để chỉ Segment trước đó ∧ 2 1 (ω)| } ≅ (ω) = M noise|Yonly | Frames ∑ i (ω) {| Với: (34) − M Th 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]): 19
  20. | ( ω) | | (ω)| = = (36) và (37) | ( ω) | | ( ω) | ng Từ thay thế (36) và (37) vào phương trình (18) ta có: . cos ( ( )) =1+ + 2. (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) : oa .H M 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: ao 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 : Th (ω) = (41) Xây dựng thuật toán cho Wiener Filter : 20

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản