En kanalvokoder i Matlab

Original English version: https://sethares.engr.wisc.edu/vocoders/channelvocoder.html

William A. Sethares (Bill)

Hva er en kanalvokoder?

Kanalvokoder fungerer som en filtrebank som bryter to innkommende lydkilder (bæreren og modulatoren) inn i kompatible frekvensområder. Konvolutten i hvert underbånd av modulatoren pålegges det passende underbåndet til bæreren, og de resulterende lydene blir lagt sammen. Som vist nedenfor, tilnærmer ikke-korrigeringens ikke-linearitet etterfulgt av et lavpassfilter lydkonvolutten i båndet. Kanalvokoder kan brukes til å generere en klassisk robotstemme når den moduleres med tale, og den har funnet omfattende bruk som en spesiell effekt i Hollywood.

 

Kanalvokoderen kan tolkes som en filterbank som påfører konvolutten til en lyd (modulatoren) på bølgeformen til en annen (transportøren). Konvoluttoperasjonen (representert her ved anvendelse av en korrigerende ikke-linearitet g(x) etterfulgt av et lavpassfilter) påføres separat innenfor hvert frekvensbånd.

 

Moderne implementeringer av Kanalvokoder erstatter vanligvis filterbankene med FFT. Dette er raskere beregningsmessig når mange bånd brukes, og både ikke-linearitet og lavpassfiltrering kan enkelt oppnås ved å bruke størrelsen på FFT. Byung Park har programmert dette som en del av sitt masterprosjekt, og (Matlab)-koden vises her. “Hjelp”-filen for chanvocoder.m lyder:

function y = chanvocoder(carrier, modul, chan, numband, overlap)
% y = chanvocoder(carrier, modul, chan, numband, overlap)
% Kanalvokoderen modulerer bæresignalet med modulasjonssignalet
% chan = antall kanaler (f.eks., 512)
% numband = antall band (<chan) (f.eks., 32)
% overlap = vinduoverlapping (f.eks., 1/4)
% skrevet av Park og Sethares 2005.

Som du kan se, krever chanvocoder to signaler. Modulatoren er vanligvis en stemme (snakk tydelig og sakte), og bæreren er vanligvis en harmonisk rik lydkilde (for eksempel et orgel, en synthesizer eller farget støy). Disse må begge ha samme antall spor, dvs. de må enten være mono eller begge være stereo. Du kan velge antall kanaler (FFT-ene er av lengde 2*chan) og antall bånd (hvor mange frekvensbånd du vil bryte signalet i), samt mengden overlapping mellom påfølgende FFT-rammer. Lyden vil endres avhengig av disse verdiene. Vanligvis vil du bruke chanvocoder.m med lydfiler i .wav-formatet. Anta for eksempel at det er en .wav-fil kalt “carrier22.wav” og en annen som heter “modulator22.wav.” En typisk måte å ringe til vocoder er:

modfile = ‘modulator22’;
carfile = ‘carrier22’;
outfile = ‘vocodedsound.wav’
[modul, sr1] = wavread(modfile);
[carrier, sr2] = wavread(carfile);
if sr1~=sr2, disp(‘samplingsfrekvensene dine stemmer ikke overens’); end
y = chanvocoder(carrier, modul, 512, 16, .2);
wavwrite(y,sr1,16,outfile)

Dette leses i de to lydfilene ved hjelp av wavread-kommandoen, sjekker at samplingsfrekvensene stemmer overens (hvis ikke, får du ikke det du forventer), kaller chanvocoder-funksjonen, og skriver deretter utgangen som en annen lydfil som du kan lytte til til i Matlab, eller ved hjelp av et lydprogram som kan spille .wav-filer. Slik at du kan sjekke for å se at alt fungerer, her er ovennevnte transportør-og modulatorfiler, sammen med utdataene du bør høre fra skriptet ovenfor. (Det kan hende du må høyreklikke for å laste ned disse filene.) Når du har lastet ned, må du sørge for at de (sammen med selve chanvocoder.m-funksjonen) plasseres i Matlab-banen. Du bør kunne kjøre programmet og få samme utdata som “vocodedsound.wav.” Ved å bruke forskjellige bærer-og modulatorlyder, er det en rekke effekter du kan lage. Du kan også være interessert i å sammenligne denne implementeringen med C-språket Zerius Vokoder– du vil oppdage at de fungerer på samme måte, og faktisk er testfilene ovenfor (carrier22 og modulator22) hentet fra Zerius-nettstedet.