matlab 倒谱ceptrum,倒谱法基频

我应用了以下公式:

倒谱=IFFT(对数FFT(s))

我得到256块,但我的结果总是错误的。。。from numpy.fft import fft, ifft

import math

import wave

import numpy as np

from scipy.signal import hamming

index1=15000;

frameSize=256;

spf = wave.open('440.wav','r');

fs = spf.getframerate();

signal = spf.readframes(-1);

signal = np.fromstring(signal, 'Int16');

index2=index1+frameSize-1;

frames=signal[index1:int(index2)+1]

zeroPaddedFrameSize=16*frameSize;

frames2=frames*hamming(len(frames));

frameSize=len(frames);

if (zeroPaddedFrameSize>frameSize):

zrs= np.zeros(zeroPaddedFrameSize-frameSize);

frames2=np.concatenate((frames2, zrs), axis=0)

fftResult=np.log(abs(fft(frames2)));

ceps=ifft(fftResult);

posmax = ceps.argmax();

result = fs/zeroPaddedFrameSize*(posmax-1)

print result

对于这种情况,如何得到结果=440?

**UPDATE:

**

我在matlab中重写了我的源代码,现在一切都正常了,我用440Hz和250Hz的频率做了测试。。。

对于440Hz,我得到441Hz不错

对于250Hz,我得到249.1525Hz接近结果

我做了一个简单的方法,让峰值进入倒谱值。

我想我可以找到更好的结果使用四分插值找到最大值!

我正在绘制440Hz的估计结果

aGfEP.png

共享用于倒谱频率估计的源:%% ederwander Cepstral Frequency (Matlab)

waveFile='440.wav';

[y, fs, nbits]=wavread(waveFile);

subplot(4,2,1); plot(y); legend('Original signal');

startIndex=15000;

frameSize=4096;

endIndex=startIndex+frameSize-1;

frame = y(startIndex:endIndex);

subplot(4,2,2); plot(frame); legend('4096 CHUNK signal');

%make hamming window

win = hamming(length(frame));

%samples multplied by hamming window

windowedSignal = frame.*win;

fftResult=log(abs(fft(windowedSignal)));

subplot(4,2,3); plot(fftResult); legend('FFT signal');

ceps=ifft(fftResult);

subplot(4,2,4); plot(ceps); legend('ceps signal');

nceps=length(ceps)

%find the peaks in ceps

peaks = zeros(nceps,1);

k=3;

while(k <= nceps - 1)

y1 = ceps(k - 1);

y2 = ceps(k);

y3 = ceps(k + 1);

if (y2 > y1 && y2 >= y3)

peaks(k)=ceps(k);

end

k=k+1;

end

subplot(4,2,5); plot(peaks); legend('PEAKS');

%get the maximum ...

[maxivalue, maxi]=max(peaks)

result = fs/(maxi+1)

subplot(4,2,6); plot(result); %legend('Frequency is' result);

legend(sprintf('Final Result Frequency =====>>> (%8.3f)',result))


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部