Ciao a tutti, ho scritto il seguente codice per il calcolo dell'LPC e la stampa a video della funzione di LPC confrontata con la FFT. Sto cercando di capire come riuscire a fare una stampa della funzione nel tempo utilizzando un grafico waterfall, qualcuno sa aiutarmi?
Ecco il sorgente:
codice:% Funzione: FTTeLPC % ------------------ % Programma per il calcolo della Fast Fourier Transform seul segnale % originale e utilizzando i coefficienti dell'LPC allo % scopo di effettuare un confronto tra i risultati ottenuti % % Prototipo: [] = FFTeLPC(file,doplotframe,doplotall,Sec) % % Input: % % Stringa che rappresenta il path del file wav da analizzare % Plot finestre LPC ( 0 = No , 1 = Si ) % Plot totale LPC ( 0 = No , 1 = Si ) % Secondi di pausa tra la stampa di una finestra e l'altra % % Output: % % % function [] = FFTeLPC(file,doplotframe,doplotall,Sec) % Leggo il file wav e ne salvo i dati e la frequenza [x,Fs]=wavread(file); %--------------INIZIALIZZAZIONI E PRIME OPERAZIONI----------------------% campione = length(x); % Applico la funzione di hamming al segnale x = x.*hamming(campione); ncoef=20; % Numero dei coefficienti da calcolare n = 200; %Lunghezza della finestra di analisi scelta overlap = 100; % Numero di campioni in sovrapposizione tra le finestre frame = floor(campione/n); % Numero di frame % Imposto la stampa delle finestre if ~exist('doplotframe') doplotframe=1; % Per default stampo le finestre di ogni frame end % Imposto la stampa del'LPC su tutto il segnale if ~exist('doplotall') doplotall=0; % Per default non effettuo la stampa su tutto il segnale end % Imposto la pausa tra la stampa di una finestra e l'altra se non assegnata if ~exist('Sec') Sec=2; % La pausa di default è 2 secondi end %-------------------CORPO ALGORITMICO DEL PROGRAMMA----------------------% % Stampo a tutto schermo if doplotframe==1 | doplotall==1 % Se si vuole stampare il grafico set(figure,'units','normalized','outerposition',[0 0 1 1]); end % Calcolo l'LPC per il primo frame X = x(1:n+overlap); % Salvo i campioni relativi al primo frame con tolleranza di overlap a = lpc(X,ncoef); % Calcolo i coefficienti LPC per il primo frame % Calcolo l'LPC per tutti i restanti frames for i = 2:frame % Ciclo sui frames % Estraggo i campioni relativi a questo frame con overlap del precedente frame X = x(1+(i-1)*n-overlap: n*i); ai = lpc(X,ncoef); % Calcolo i coefficienti LPC per il corrente frame if doplotframe==1 % Se si vuole stampare il grafico su tutto il segnale PlotFFT(X,4096); % Stampo FFT dal segnale originale PlotLPC(ai,4096); % Stampo FFT dai coefficienti LPC pause(Sec); end end if doplotall==1 % Se si vuole stampare il grafico su tutto il segnale % Calcolo i coefficienti dell'LPC a = lpc(x, ncoef); PlotFFT(x,4096); % Stampo FFT dai coefficienti LPC PlotLPC(a,4096); % Stampo FFT dal segnale originale end %------------------OPERAZIONI FINALI E DI CHIUSURA-----------------------% fprintf('\n'); disp('Premere un tasto per terminare...') pause clc % Pulisco il terminale clear % Dealloco le variabili utilizzate close % Chiudo tutte le finestre aperte end %------------------FUNZIONI DI STAMPA-----------------------% % Nota: per portare tutto nel dominio della frequenza è anche possibile % utilizzare freqz ( forse più corretto ) % Input: Coefficienti Segnale e Numero di valori da calcolare function PlotFFT(Coeff, N) % Calcolo la Fast Fourier Transform in N Punti ( Le Armoniche che % compongono il nostro campione ) FFT = fft(Coeff,N); % Prendo una parte dello spettro dei valori FFT e li traspongo ( La riga % diventa colonna ), in altre parole prendo un solo lato dello spettro che % da questo punto in poi si ripeterebbe specularmente. FFT = FFT(1:N/2+1)'; % Applico un coefficiente moltiplicativo a tutti i valori, rendendoli % positivi, per effettuare una stampa di un grafico più omogenea ( non % cambio le informazioni sui coefficienti che rimane tale a meno di questo % coefficiente moltiplicativo) FFT = 10*log10(abs(FFT).^2); clf; % Cancello i grafici attualmente visualizzati plot(FFT'); % Stampo i valori FFT trasposti ( La colonna diventa riga ) hold on; end % Input: Coefficienti LPC e Numero di valori da calcolare function PlotLPC(Coeff, N) % Recupero le informazioni sulle armoniceh componenti il suono a partire % dai valori ( compressi ) dell'LPC, per effettuare un paragone tra la % "realtà" e l'approssimazione dovuta alla compressione LPC LPCPlot = fft(Coeff,N); % Effettuo le stesse operazioni applicate sui valori dell'FFT per una % coerenza nella stampa % Prendo una parte dello spettro dei valori FFT, in altre parole prendo % un solo lato dello spettro che da questo punto in poi si ripeterebbe % specularmente. Inoltre inverto questi valori ( generalmente < 0 ) per % farli divenire ( generalmente ) grandi per una stampa ottimale nel % confronto con l'FFT dal segnale originale LPCPlot = 1./LPCPlot(1:N/2+1); % Applico un coefficiente moltiplicativo a tutti i valori, rendendoli % positivi, per effettuare una stampa di un grafico più omogenea ( non % cambio le informazioni sui coefficienti che rimane tale a meno di questo % coefficiente moltiplicativo) LPCPlot = 10*log10(abs(LPCPlot).^2); plot(LPCPlot,'r','linewidth',2); % Stampo i valori dell'LPC hold on; title('Confronto tra FFT da Segnale e da Coeff LPC'); xlabel('Frequenza ( Hz )'); ylabel('Potenza ( dB ) [A meno di una costante]'); grid; end



Rispondi quotando