1

我有一个语音框架。当我计算 LP 残差时,我无法真正估计音高。我需要找到每一帧的音高周期。但是,当我使用频域和时域时,它们都不能正常工作。有人可以帮我吗?我需要它来查找基于音高跟踪的音高同步窗口

我的代码的结果就像在此处输入图像描述 谢谢

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;
4

2 回答 2

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 的纯正弦曲线来向您展示如何在时域中完成!

于 2014-02-24T15:17:08.593 回答
0

我不太了解语音分析,但也许这可以帮助你:

这里有一篇关于这个的mathworks文章:http: //www.mathworks.de/de/help/signal/ug/estimating-fundamental-frequency-with-the-complex-cepstrum.html

他们计算时间帧的倒谱,然后识别倒谱中的峰值并找到对应于峰值的频率。

于 2014-02-24T12:22:40.657 回答