gpt4 book ai didi

java - 使用 FFT 计算频率时的错误值

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:13 24 4
gpt4 key购买 nike

我得到错误的频率,我不明白为什么我得到错误的值。因为我已经按照指令计算,然后是 stackoverflow。我用过 FFT http://introcs.cs.princeton.edu/java/97data/FFT.java.html和复杂的 http://introcs.cs.princeton.edu/java/97data/Complex.java.html

audioRec.startRecording();
audioRec.read(bufferByte, 0,bufferSize);
for(int i=0;i<bufferSize;i++){
bufferDouble[i]=(double)bufferByte[i];
}
Complex[] fftArray = new Complex[bufferSize];
for(int i=0;i<bufferSize;i++){
fftArray[i]=new Complex(bufferDouble[i],0);
}
FFT.fft(fftArray);
double[] magnitude=new double[bufferSize];
for(int i=0;i<bufferSize;i++){
magnitude[i] = Math.sqrt((fftArray[i].re()*fftArray[i].re()) + (fftArray[i].im()*fftArray[i].im()));
}
double max = 0.0;
int index = -1;
for(int j=0;j<bufferSize;j++){
if(max < magnitude[j]){
max = magnitude[j];
index = j;
}
}
final int peak=index * sampleRate/bufferSize;
Log.v(TAG2, "Peak Frequency = " + index * sampleRate/bufferSize);
handler.post(new Runnable() {
public void run() {
textView.append("---"+peak+"---");
}
});

我正在获取 21000、18976、40222、30283 等值...请帮我.....谢谢..

最佳答案

您的源代码几乎没问题。唯一的问题是您要在整个光谱中搜索峰值,即从 0 通过 Fs/2 到 Fs。

对于任何实值输入信号(您拥有),Fs/2 和 Fs(=采样频率)之间的频谱是 0 和 Fs/2 之间频谱的精确镜像(我发现 this nice background explanation )。因此,对于每个频率,存在两个振幅几乎相同的峰值。我写“几乎”是因为由于机器精度有限,它们不一定完全相同。因此,您可以在频谱的前半部分随机找到包含低于奈奎斯特频率 (=Fs/2) 的频率的峰值,或者在包含高于奈奎斯特频率的频率的频谱的后半部分找到峰值。

如果您想自己更正错误,请停止阅读此处。否则继续:

只是替换

for(int j=0;j<bufferSize;j++){

for(int j=0;j<=bufferSize/2;j++){

在您提供的源代码中。

P.S.:通常情况下,最好将窗函数应用于分析缓冲区(例如汉明窗),但对于您的峰值拾取应用,它不会对结果产生太大影响。

关于java - 使用 FFT 计算频率时的错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21853063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com