Ievads adaptīvos atbalss novēršanā

STOBRS - IEVADS (Jūnijs 2019).

$config[ads_text] not found
Anonim

Ievads adaptīvos atbalss novēršanā


Šis raksts iepazīstina ar pamata akustisko atbalss atcelšanu, pamatojoties uz viszemāko kvadrātu (LMS) algoritmu. Akustiskās echokompresori ir nepieciešami daudziem mūsdienu sakaru produktiem. Es esmu pārliecināts, ka jūs esat saskārušies ar laiku, kad, sarunājoties pa tālruni, jūs varētu dzirdēt savu balsi, izlabojiet teksta izlīdzināšanu: centrā;

1. attēls

Šeit skaļruņa runas signāls tiek akustiski pieslēgts skaļruņa tālruņa vai brīvroku mobilā tālruņa mikrofonam, kas dzirdams tālvadības signāla avotā kā atgriezeniskā atbalss. Echo izslēdz echo atcelšanas ierīci echo avotā, izmantojot sistēmu, kas modelēta augšējā attēlā. Pieņemsim, ka kanālam ir atlasīta datu impulsa atbilde, ko attēlo Z-pārveidojums:

$ $ H (Z) = 1 + 0.5Z ^ (-3) + 0.1Z ^ (- 5) $ $

un echo canceller ir aizturēts filtrs ar 50 paraugu garumu. Vispirms ļaujam vajadzīgo signālu s (t) būt nullei, un vilciens atcelšanas filtru ar baltu troksni. Kopsavilkumā signāli 1. attēlā ir šādi:

$ $ \ text {runas signāls}: s (t) $ $

$ $ \ text {echo}: r (t) $ $

$ $ \ text {akustiskais kanāls}: h (t) $ $

$ $ \ text {akustisko kanālu izlaide} = r (t) * h (t) \ text {(konvolution)) $ $

$ $ \ text {mikrofona ieeja}: s (t) + r (t) * h (t), \ text {vēlamais signāls plus atbalss pa akustisko kanālu} $ $

$ $ \ text {echo canceller}: \ hat (h) (t) $ $

$ $ \ text (vēlamais signāls): y (t) $ $

Mērķis ir saskaņot akustisko kanālu ar mūsu atbalss atcelšanas funkciju, lai mēs varētu invertēt akustisko kanālu reakciju un mikrofona ieejām izveidot tikai vēlamo signālu (t). Tātad ļauj uzzināt, kā tas izskatās Matlab kodā:

 clear all; clf; close all; %acoustic channel frequency response num = (1 0 0 0.5 0 .1); den = (1 0 0 0 0 0); (Hc, Wc) = freqz(num, den); %---BUILD FM SWEEP---% fs = 2*pi; tmax = 10000; f1=0; f2 = .5; tsweep = 0:499; slope = (f2-f1)/1000; F = slope.*(mod(tsweep, 500)); t = 0:1:tmax; fm = cos(2*pi*slope*t); F = slope.*(mod(tsweep, 500)); fm2 = cos(2*pi*(F).*tsweep); fm2c = repmat(fm2, 20, 1); fm2 = reshape(fm2c', 1, 10000 ); figure plot((0:999), fm2(2001:3000)) %subplot(212) %plot((-512:511)*1/(2*pi), 20*log10(abs(fft(fm2(1:500), 1024)))) grid on %End building of FM sweep trainlen = tmax; %training signal r_t = 1*rand(1, tmax); %desired signal s_t = 0; %signal through channel rt_ht = filter(num, den, r_t); %signal through channel + desired mic_in = s_t + rt_ht; %LMS algorithm of echo canceller reg1=zeros(1, 50); wts = (zeros(1, 50)); mu = .07; for n = 1:trainlen wts_sv = wts; reg1 = (r_t(n) reg1(1:49)); err = mic_in(n) - reg1*(wts'); y(n) = err; wts = wts + mu*(reg1*(err')); end %plots figure subplot(211) plot(1:length(y), (y)) hold on plot(1:10000, zeros(1, 10000), 'color', 'r', 'linewidth', 2, 'MarkerSize', 2) hold off axis(( -.5 10000 -1 1.1)) grid on title('Steady State (time response) Desired Signal = 0, trained with white noise') subplot(212) plot(1:length(y), 20*log10(abs(y))) grid on title('Log Magnitude Training Curve, trained with white noise') (Hf, Wf) = freqz(wts_sv); figure subplot(211) plot(Wc/pi, 20*log10(abs(Hc))) grid on title('Frequency Response of Channel') subplot(212) plot(Wf/pi, 20*log10(abs(Hf)), 'color', 'r') title('Frequency Response of Adaptive Canceller, trained with white noise') grid on 

Lejupielādes kods

Kodā mēs vispirms pievienojam akustisko kanālu atbildi Hc un Wc mainīgajiem. Tad mēs izveidojam FM slaucīšanas apmācības signālu, lai to izmantotu echo canceller apmācības otrajā daļā. Tad mēs definējam signālus r_t, s_t, Ort_ht un mic_in, lai atspoguļotu 1.attēlu. Tagad nāk lielākā daļa adaptīvās atcelšanas: mēs to apmācām ar vienkāršu iteratīvāko vismazāko kvadrātu pieeju.

Pirmkārt, mēs definējam dziļuma 50 reģistru. Tas ir analogs masīvam C vai C + + (iegultais lietojumprogramma). Tad mēs definējam tukšu svaru masu - wts - un iestatiet $ $ \ mu $$, kas ir svarīgs pastiprinājuma faktors vismaz vidējā kvadrātu algoritmā, kas ņem mazus soļus katrai iterācijai, lai atrastu optimālo svaru kopumu, kas apraksta akustisko kanālu un sniedziet vismazāko kļūdu katrai ievadei. LMS algoritms ir vienkāršs - vispirms reģistram pievienojam baltā trokšņa paraugu, pēc tam aprēķina kļūdu:

$ $ err = \ text {mic_in} (n) - reg1 * wts '$$

un pēc tam atjauniniet svarus

$ $ wts = wts + \ mu * (reg1 * err ') $ $

Svara atjaunināšanas atvasinājums ir ilgs laiks, ko es neiegrāmoju šajā rakstā, bet drīzumā publicēs atsevišķu skaidrojumu. Tomēr atjauninājums samazina pašreizējo svaru, kā arī $ $ \ mu $ $ reizes, kad reģistra saturs ir kļūdas transponēšanas laiks. Izņemot šo palaišanu līdz konverģencei, mēs redzam, ka mūsu algoritms atrod galīgo svaru komplektu, kad tas tiek apmācīts par baltu troksni, lai sasniegtu vēlamo signālu no 0.

Un mēs varam redzēt atbalss atcelšanas atbildi gandrīz precīzi sakrīt ar akustisko kanālu frekvences reakciju.

Tagad, ja mēs to apmācām bez FM signāla, mēs redzam, ka tas tuvojas mazliet lēnāk, bet kļūda ir mazāka!

Un tas ir - diezgan pienācīgs echo nomācējs pāris koda rindiņās. Lūdzam izlasīt rakstu par vismazāko kvadrātu, lai rūpīgāk izpētītu algoritma darbību!