Matlab:如何找到一个语音的基本频率

时间:2015-06-06 12:47:21

标签: matlab signal-processing fft

我也是Matlab和语音处理的新手。我想找到语音信号的基频来确定说话者的性别。我通过在10毫秒内分析它来消除信号中的静音。

之后我使用此代码获得了fft:

 abs(fft(input_signal_without_silences)) 

我的语音信号和fft的情节如下:

enter image description here

现在,我想找到基本频率,但我无法理解我需要执行哪些步骤。或者我是否误解了这个概念?

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

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

2 个答案:

答案 0 :(得分:0)

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)|')

答案 1 :(得分:0)

问题在于你有幅度与样本数的关系图而不是幅度与频率的关系图。为了计算基频,你需要找到与最高频率相对应的频率。

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

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

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

所以你基本上所需要做的就是得到图最高的索引并用上面的等式代替它来得到基频的估计值。确保 n> N / 2 使您的基频为正。

相关问题