Matlab:如何找到语音的基频

Matlab:如何找到语音的基频,matlab,signal-processing,fft,Matlab,Signal Processing,Fft,我对Matlab和语音处理也是新手。我想找出语音信号的基本频率来确定说话人的性别。我通过在10毫秒内对信号进行分析,消除了信号中的沉默 之后,我使用以下代码获得fft: abs(fft(input_signal_without_silences)) 我对语音信号及其fft的绘制如下: 现在,我想找到基频,但我不知道我需要做哪些步骤。还是我误解了这个概念 据我所知,有一些方法,比如自相关 由于我对语音处理和matlab都不熟悉,非常感谢您的帮助和建议。fft()帮助可以解决大部分问题。我可

我对Matlab和语音处理也是新手。我想找出语音信号的基本频率来确定说话人的性别。我通过在10毫秒内对信号进行分析,消除了信号中的沉默

之后,我使用以下代码获得fft:

 abs(fft(input_signal_without_silences)) 
我对语音信号及其fft的绘制如下:

现在,我想找到基频,但我不知道我需要做哪些步骤。还是我误解了这个概念

据我所知,有一些方法,比如自相关

由于我对语音处理和matlab都不熟悉,非常感谢您的帮助和建议。

fft()帮助可以解决大部分问题。我可以根据帮助文件的内容简要介绍一下情况

目前,您正在绘制的是双面的、非标准化的fft系数,这说明不了什么。使用以下步骤可以获得更多用户了解的语音信号频谱分析。使用单边频谱仪,您将能够找到可能是语音信号基频的主频

y = [];                       %whatever your signal
T = 1e-2;                     % Sample time, 10 ms
Fs = 1/T;                     % Sampling frequency

L = length(y);                % Length of signal 

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

问题是你有一个振幅与采样数的曲线图,而不是振幅与频率的曲线图。为了计算基频,你需要找到对应于最高频率的频率

Matlab返回从-fs/2到fs/2的频率,因此索引n处的频率为

f=n*(fs/n)-(fs/2)

其中f=频率,fs=采样频率,N=FFT中的点数


因此,基本上你所需要做的就是得到图中最高的指数,并将其代入上面的方程中,以得到基频的估计值。确保n>n/2,这样你的基频为正。

我发现这堂课很有启发性和全面性: