我有一个语音框架。当我计算LP残差时,我无法真正估算出音高。 我需要找到每帧的音高周期。但是,当我使用频域和时域时,它们都不能很好地工作。谁能帮助我? 我需要find Pitch-synchronous windowing based on pitch tracking
我的代码的结果就像 谢谢
MATLAB代码如下:
frame_length=0.03*fs;
frame=wave1((i-1)*frame_length+1:i*frame_length);
N=256;
Y1 = fft(frame,N);
f = 0 : fs / N : fs - 1 / N;
N1 = length(Y1);
%Y1(1) = [];
power1 = abs(Y1(1:floor(N1))).^2;
nyquist = 1/2;
freq1 = (1:floor(N1/2))/floor(N1/2)*nyquist;
[val loc]=max(power1);
pitch_priod = round(fs*(1./f(loc)));
或
frame=wave1((i-1)*frame_length+1:i*frame_length);
min_pitch=floor(fs/600); % Pitch for men 50 to 300 Hz and for women 100 till 600 Hz
max_pitch=floor(fs/50);
y1=xcorr(frame);
y1=y1./(abs(max(y1)));
y2=y1(min_pitch:max_pitch);
[val loc]=max(y2);
pitch_priod=loc+min_pitch;
答案 0 :(得分:3)
我们不知道您的帧的大小和您的采样率,快速查看您的频域代码说我从FFT获得256点,这可能不足以获得准确的结果,尝试将您的信号分成更大要传递给FFT的帧!
对于时域,帧的大小也很重要!
这里有一个简单的自相关示例:
f = 500;
Fs=8000
frame= 0.9*sin(2*pi*f/Fs*(1:4096));
X = xcorr(frame,160,'coeff');
X=X(160+1:2*160+1);
[Xmax,i]=max(X(8:end));
%Period
P = (8+i-2)
%Pitch Test, this result need be near or equal f
Fs/P
尝试找到介于50和1000赫兹之间的音高,我只使用帧大小= 4096的纯正弦曲线来向您展示如何在时域中完成!
答案 1 :(得分:0)
我不太了解语音分析,但也许这可以帮到你:
这里有一篇关于此的数学文章:http://www.mathworks.de/de/help/signal/ug/estimating-fundamental-frequency-with-the-complex-cepstrum.html
他们计算时间帧的倒谱,然后识别倒谱中的峰值并找到与峰值相对应的频率。