Ciao a tutti. Sto facendo un progetto per l'università nel quale, dato un file .wav, devo isolare una parola dal segnale e riprodurla.
Io ho scritto questo codice
codice:function N_signal=EndPointing(data) %leggi il file wav %[data,samplingRate,nBitsPerSample] = audioread('test[00000].wav'); [data, samplingRate]=audioread('test[00000].wav'); samplingRate = 48500; %trasformo il segnale nel dominio delle frequenze fourierData = fft(data,length(data)); magFour = abs(fourierData); totalFileTimeInMSec = (length(data) / samplingRate)*100; %user input: %la durata di ogni frame dioende dalla dimensione del file audio e dalla %dimensione dei segmenti delle parole frameLengthInMSec = 1; %calcolo il numero di frame numberOfFrames = totalFileTimeInMSec / frameLengthInMSec; numberOfFrames = floor(numberOfFrames); % calcolo la dimensione di ogni frame nell'array frameSize = samplingRate * frameLengthInMSec / 100; %inizializzo i frame frames = zeros(numberOfFrames,frameSize); frame = zeros(1,frameSize); %copio i dati del segnale nei frame startIndex = 1; endIndex = frameSize; for frameM = 1:1:numberOfFrames frame = data(startIndex:endIndex,1); startIndex = startIndex + frameSize; endIndex = endIndex +frameSize; frames(frameM,:) = frame.'; end %calcolo P (mean^2) framesSqr = frames.^2; P = mean(framesSqr,2); %calcolo Z (differenza media) Z = mean(abs(diff(abs(frames),1,2))./2,2); %calcolo W combinazione di P e Z. 1000 è un fattore scalare W = P.*(1-Z).*1000; % calcolo la soglia VAD meanW = mean(W); stdDevW = std(W); gamma = 0.2*stdDevW^-0.8; threshold = meanW + gamma*stdDevW; thresholdedW = zeros(1,length(W)); %soglia W for i = 1:1:length(W) if W(i)> threshold thresholdedW(i) = 1; end end %attenua la soglia W per unirsi ai segmenti vicini %smoothing window = 5 (default) smoothVAD = smooth(thresholdedW,10); %soglia a VAD di nuovo for i = 1:1:length(smoothVAD) if smoothVAD(i)> 0 smoothVAD(i) = 1; end end C= 0; %step-1 interrompo il segnale e il frame a 0.01 secondi for i=1:numberOfFrames %estraggo il frame dal segnale frame = data((i-1)*frameSize+1 : frameSize*i).* smoothVAD(i); %identifico la parola trovando il frame con ampiezza massima > 0.03 S = sum(frame); if(S ~= 0) C = C+1; %creo un nuovo segnale senza silenzio N_signal((C-1)*frameSize+1 : frameSize*C) = frame; end end plot(frame); end
Il problema è che quando visualizzo il segnale alla fine, risulta una semplice linea piatta e non mi estrae la singola parola. Inoltre non saprei come riprodurre la variabile frame.
Qualcuno potrebbe darmi una mano?

Rispondi quotando
