【问题标题】:Matlab: how to find fundamental frequency of a speechMatlab:如何找到语音的基频
【发布时间】:2015-06-06 23:28:15
【问题描述】:
我也是 Matlab 和语音处理的新手。我想找到语音信号的基频来确定说话者的性别。我通过在 10 毫秒的周期内对其进行分析,消除了信号中的静默。
之后我使用此代码获得了 fft:
abs(fft(input_signal_without_silences))
我对语音信号及其 fft 的图如下:
现在,我想找到基频,但我不明白我需要执行哪些步骤。还是我误解了这个概念?
据我所知,有一些方法,比如自相关,
由于我对语音处理和matlab都不熟悉,非常感谢任何帮助和建议。
【问题讨论】:
标签:
matlab
signal-processing
fft
【解决方案1】:
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)|')
【解决方案2】:
问题是您有一个幅度与样本数的图,而不是幅度与频率的图。为了计算基频,您需要找到对应于最高频率的频率。
Matlab 返回从 -fs/2 到 fs/2 的频率,因此索引 n 处的频率为
f = n * (fs/N) - (fs/2)
其中 f = 频率,fs = 采样频率,N = FFT 中的点数。
所以基本上你需要做的就是获取绘图最高处的索引并将其代入上面的等式以获得基频的估计值。确保 n > N/2 所以你的基频是正的。