1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| clc
clear all;
close all;
%lecture du signal
[signal,fs] = wavread('ah.wav');
signal = resample(signal,3000,32000);
%********************************elimination du silence et filt*********
% On travaille en mono
signal = signal(:,1);
% Affichage du signal
subplot(311)
plot(signal,'b')
title('Signal');
% Calcul de l'énergie (approximation)
S = abs(signal);
m = min(S(:));
S = S - m;
M = max(S(:));
S = S/M;
e = S.^2;
% Seuillage de e
seuil = .01;
e = e>seuil;
% Détection des "silences"
idx(1) = find(e>seuil,1,'first');
idx(2) = find(e>seuil,1,'last');
signal(1:idx(1)) = 0;
signal(idx(2):end) = 0;
x=signal(idx(1):idx(2));
subplot(3,1,1),plot(x)
%la dsp
nfft=512;
fe=100000;
n=1024;
deltaf=fe/nfft;
f=[0:(nfft-1)/2]*deltaf;
xn=fft(x,nfft);
dsp=xn.*conj(xn)/n;
plot(f,dsp(1:nfft/2)),grid
%methode cepsctrale:
ms2=floor(fs*0.002);
ms10=floor(fs*.01);
ms20=floor(fs*0.02);
ms30=floor(fs*0.03);
% plot waveform
t=(0:length(x)-1)/fs;
plot(t,x);
legend('Waveform');
xlabel('Time (s)');
ylabel('Amplitude');
% get window
w=hamming(ms30);
pos=1;
fx=[];
while (pos+ms30) <= length(x)
y=x(pos:pos+ms30-1);
% do fourier transform of windowed signal
Y=fft(y.*w);
% cepstrum is DFT of log spectrum
C=fft(log(abs(Y)+eps));
% search for maximum between 2ms (=500Hz) and 20ms (=50Hz)
[c,fxval]=max(abs(C(ms2:ms20)));
fx=[fx fs/(ms2+fxval-1)];
pos=pos+ms10;
end;
% plot FX trace
t=(0:length(fx)-1)*0.01
subplot(3,1,2);
plot(t,fx);
legend('FX Trace');
xlabel('Time (s)');
ylabel('Frequency (Hz)'); |
Partager