function output = vocoder(c, f) % Synthese- (carrier) und Analyse-Signal (formant) als miraudio-Objekte % einlesen: % Synthesesignal einlesen carrier = miraudio(c); % Spektrum des Synthesesignals darstellen mirspectrum(c, 'Frame', 'Min', 0, 'Max', 2000, 'NormalInput') % Synthesesignal abspielen mirplay(c) % Analysesignal einlesen formant = miraudio(f); % Spektrum des Analysesignals darstellen mirspectrum(f, 'Frame', 'Min', 0, 'Max', 2000, 'NormalInput') % Analyesesignal abspielen mirplay(f) % Aufteilen beider Signale in Frequenzbaender % dies kann manuell geschehen oder auf der Grundlage der Voreinstellungen % der mirfilterbank: % manuell: % bands = [-Inf, 31.5, 35.5, 40, 45, 50, 56, 63, 71, 80, 90, 100, 112, 125, 140, 160, 180, 200, 224, 250, 280, 315, 355, 400, 450, 500, 560, 630, 710, 800, 900, 1000, 1120, 1250, 1400, 1600, 1800, 2000, 2240, 2500, 2800, 3150, 3550, 4000, 4500, 5000, 5600, 6300, 7100, 8000, 9000, 10000, 11200, 12500, Inf]; % cBands = mirfilterbank(carrier, 'Manual', bands); % cBandsData = mirgetdata(cBands); % fBands = mirfilterbank(formant, 'Manual', bands); % mit Voreinstellungen der mirfilterbank: % Synthesesignal in Filterbereiche aufteilen cBands = mirfilterbank(carrier); % Daten der Synthesefilterbereiche in eine Variable (cBandsData) speichern cBandsData = mirgetdata(cBands); % Analysesignal in Filterbereiche aufteilen fBands = mirfilterbank(formant); % Anzahl der Frequenzbänder zwischenspeichern numBands = length(cBandsData(1, 1, :)); % Bestimmen der Hüllkurven der Bänder des Analysesignals fBandsEnv = mirenvelope(fBands, 'Sampling', 44000, 'HalfwaveCenter', 'Lambda', -0.001) % Daten der Hüllkurven der Analysefilterbereiche in eine Variable (fBandsEnvData) speichern fBandsEnvData = mirgetdata(fBandsEnv); % Gegebenenfalls verlaengern des Traegersignals, falls es zu kurz ist % und anpassen an die Laenge des Formantsignals while length(cBandsData) < length(fBandsEnvData) cBandsData = repmat(cBandsData, 2, 1); end cBandsData = cBandsData(1 : length(fBandsEnvData), :, :); % Frequenzbänder des Synthesesignals (cBandsData) mit Kanalhüllkurven des % Formantsignals (fBandsEnvData) multiplizieren bandsSum = cBandsData .* fBandsEnvData; % Frequenzbänder wieder zusammenfuegen sum = bandsSum(:, :, 1); for i = 2:numBands sum = sum + bandsSum(:, :, i); end % Ergebnis zu einem miraudio-Objekt machen sumaudio = miraudio(sum, 44000); % Ergebnis normalisieren sumaudio = miraudio(sumaudio, 'Normal'); % Ergebnisabspielen mirplay(sumaudio) % Ergebnis im Spektrum anzeigen mirspectrum(sumaudio, 'Frame', 'Min', 0, 'Max', 2000, 'NormalInput') % Ergebnis abspeichern mirsave(sumaudio, 'vocodiert') % Ergebnis zur Ausgabe der Funktion machen output = sumaudio;