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