Dear forum,
I created a synthetic speech signal x[n] of 256 samples assuming that the source
signal u[n] is an impulse train (not a glottal flow signal) and also I assumed
that there are no lips. The vocal tract filter h[n] is an all pole filter of
order 10. So, in frequency domain we have X(w)=H(W)U(W).
I computed with the modified periodogram the PSD of X(w) and with freqz the PSD
of H(w) with the following matlab code:
N = 256; % signal length
T = 90; % pitch period
Fs = 8000; % sampling frequency
u = zeros(1,N); % source signal
u([1:T:N])=1;
% computing the vocal tract filter for the vowel /a/
F = [650, 1075, 2463, 3558, 4631]; % Formant frequencies (Hz)
BW = [94, 91, 107, 198, 89]; % Formant bandwidths (Hz)
poles = exp(-pi*BW/Fs) .* exp(j*(2*pi*F/Fs)); % convert formants to poles
num = 1;
den = real(poly([poles,conj(poles)]));
% creating the speech signal x
x = filter(num,den,u);
x = x(:);
NFFT=N;
% Choose window
% win = rectwin(N);
win = hanning(N);
% win = hamming(N);
% win = blackman(N);
X = fft(win.*x,NFFT);
X = X(1:NFFT/2+1);
psdX = (1/(norm(win,2)^2)).*(abs(X).^2); % modified periodogram
psdX(2:end-1) = 2*psdX(2:end-1); % normalized periodogram
psdX = 10*log10(psdX); % in dB
f = linspace(0,Fs/2,NFFT/2+1);
psdH = freqz(num,den,f,Fs)./norm(win,2);
psdH = 20*log10(abs(psdH));
plot(psdX,'b');
hold on;
plot(psdH,'r');
The problem as you can see is that the psdH (i.e. the spectral envelope) is not
exactly on the Top of psdX. The book of T.F. Quatieri (Discrete-Time Speech
Signal Processing:Principles and Practice) says that the spectral envelope
should be exactly on the Top of the periodogram of X(w).
I have the bad feeling that I have not normalized correctly the PSD of H(w).
I have spent more than two days on this problem and I cannot find the solution.
Please let me know if I have done any mistake.
Kind regards,
Andreas
_____________________________________
Spectral envelope normalization (speech processing)
Started by ●February 13, 2014