Εισαγωγή στους προσαρμόσιμους εναρμονιστές Echo

No mans Sky NEXT Character customizer (Ενδέχεται 2019).

$config[ads_text] not found
Anonim

Εισαγωγή στους προσαρμόσιμους εναρμονιστές Echo


Αυτό το άρθρο εισάγει έναν βασικό ακουστικό ελεγκτή ηχώ βασισμένο στον αλγόριθμο Least Mean Squares (LMS). Οι ακουστικοί ελεγκτές ηχώ είναι απαραίτητοι για πολλά σύγχρονα προϊόντα επικοινωνίας. Είμαι σίγουρος ότι συναντήσατε μια εποχή που ακούσατε τη φωνή σας ενώ μιλάτε στο τηλέφωνο, διορθώστε "text-align: center;">

Φιγούρα 1

Εδώ, το σήμα ομιλίας από ένα μεγάφωνο ακουστικά συζευγνύεται στο μικρόφωνο ενός ηχείου ή ενός hands-free κινητού τηλεφώνου, το οποίο ακούγεται στην απομακρυσμένη πηγή σήματος ως ηχώ επιστροφής. Η ηχώ καταστέλλεται από ένα σύστημα ακύρωσης ηχώ στην πηγή ηχώ από το σύστημα που υποδείχθηκε στο σχήμα παραπάνω. Υποθέστε ότι το κανάλι έχει την δειγματοληπτική αντίδραση παλμού δεδομένων που αντιπροσωπεύει ο μετασχηματισμός Z:

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

και ο ακυρωτής ηχώ είναι ένα φίλτρο καθυστέρησης με μήκος 50 δειγμάτων. Πρώτα θα αφήσουμε το επιθυμητό σήμα s (t) να είναι μηδέν και να εκπαιδεύσουμε το φίλτρο ακύρωσης με λευκό θόρυβο. Ως σύνοψη, τα σήματα στο σχήμα 1 είναι:

$$ \ κείμενο {σήμα ομιλίας}: s (t) $$

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

$$ \ κείμενο {ακουστικό κανάλι}: h (t) $$

$$ \ text {έξοδος ακουστικού καναλιού} = r (t) * h (t) \ text {(συνέλιξη)} $$

$$ \ text {είσοδος μικροφώνου}: s (t) + r (t) * h (t), \ κείμενο {επιθυμητό σήμα plus echo μέσω ακουστικού καναλιού}

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

$$ \ κείμενο {επιθυμητό σήμα}: y (t) $$

Ο στόχος είναι να ταιριάζει με το ηχητικό κανάλι με τον ακυρωτή ηχώ μας ώστε να μπορέσουμε να αντιστρέψουμε την απόκριση των ακουστικών καναλιών και να δημιουργήσουμε μόνο το επιθυμητό σήμα στις εισόδους μικροφώνου (t). Έτσι, μπορείτε να δείτε πώς φαίνεται αυτό στον κώδικα Matlab:

 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 

Λήψη κώδικα

Στον κώδικα, προσθέτουμε πρώτα την απόκριση του ακουστικού καναλιού στις μεταβλητές Hc και Wc. Στη συνέχεια, κατασκευάσαμε ένα σήμα εκπαίδευσης σάρωσης FM για χρήση στο δεύτερο μέρος της εκπαίδευσης του ελεγκτή ηχώ. Στη συνέχεια ορίζουμε τα σήματα r_t, s_t, Ort_ht και mic_in για να αντικατοπτρίσουμε το Σχήμα 1. Τώρα έρχεται ο μεγαλύτερος όγκος του προσαρμοστικού ακυρωτή: το εκπαιδεύουμε με μια απλή επαναληπτική προσέγγιση των ελάχιστων τετραγώνων.

Κατ 'αρχάς, ορίζουμε ένα μητρώο βάθους 50. Αυτό είναι ανάλογο ενός πίνακα σε C ή C ++ (ενσωματωμένη εφαρμογή). Στη συνέχεια ορίζουμε ένα άδειο σύνολο βαρών - wts - και ορίζουμε το $$ \ mu $$, το οποίο είναι ένας σημαντικός παράγοντας σταδιακής αύξησης στον ελάχιστο μέσο τετραγωνικό αλγόριθμο ο οποίος παίρνει μικρά βήματα κάθε επανάληψη για να βρει το βέλτιστο σύνολο βαρών που περιγράφουν το ηχητικό κανάλι και να δώσει το μικρότερο σφάλμα για κάθε είσοδο. Ο αλγόριθμος LMS είναι απλός - προσθέτουμε πρώτα ένα δείγμα λευκού θορύβου στο μητρώο και στη συνέχεια υπολογίζουμε το σφάλμα:

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

και στη συνέχεια να ενημερώσετε τα βάρη

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

Η εξαγωγή της ενημερωμένης έκδοσης βάρους είναι μια εξήγηση που δεν θα μπει σε αυτό το άρθρο, αλλά θα δημοσιεύσει σύντομα ξεχωριστή εξήγηση. Ωστόσο, η ενημέρωση μειώνει τα τρέχοντα βάρη συν τα περιεχόμενα του μητρώου κατά τη μεταφορά του σφάλματος. Αφήνοντας αυτό το τρέξιμο μέχρι τη σύγκλιση, βλέπουμε ότι ο αλγόριθμός μας βρίσκει το τελικό σύνολο βαρών όταν εκπαιδεύεται σε λευκό θόρυβο για να φτάσει στο επιθυμητό σήμα του 0.

Και μπορούμε να δούμε ότι η απόκριση του ακύρωσης ηχώ συμπίπτει σχεδόν ακριβώς με την απόκριση συχνότητας των ακουστικών καναλιών.

Τώρα αν το εκπαιδεύσουμε χωρίς το σήμα FM, βλέπουμε ότι συγκλίνει λίγο πιο αργά, αλλά το σφάλμα είναι μικρότερο!

Και αυτό είναι - ένας αρκετά καλός ακυρωτής ηχώ σε δύο γραμμές κώδικα. Κοιτάξτε το άρθρο του Least Mean Squares για μια διεξοδικότερη έρευνα για το πώς λειτουργεί ο αλγόριθμος!