【问题标题】:Find Pitch in speech frame在语音帧中查找音高
【发布时间】:2014-02-24 10:53:00
【问题描述】:

我有一个语音框架。当我计算 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;

【问题讨论】:

    标签: matlab signal-processing speech-recognition pitch pitch-tracking


    【解决方案1】:

    我们不知道您的帧大小和采样率,快速查看您的频域代码告诉我您是否从 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 的纯正弦曲线来向您展示如何在时域中完成!

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • Tnx 但链接打不开。
      • 哎呀,我修复了链接,我的错
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      相关资源
      最近更新 更多