gpt4 book ai didi

java - Android - 计算 FFT 后频率不正确

转载 作者:行者123 更新时间:2023-11-30 09:15:52 27 4
gpt4 key购买 nike

我开始使用一些参数从 AudioRecord 录制声音。

private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
this.recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, this.bufferSize);

我将数据存储到 ArrayList< byte[] > soundRecord 中;

while (this.isRecording) {
read = this.recorder.read(data, 0, this.bufferSize);
if (AudioRecord.ERROR_INVALID_OPERATION != read) {
try {
soundRecord.add(data);
os.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}

这是我将声音计算为复数数组 FFT 的方法。在这样做之前,我将 byte 转换为 double。

public ArrayList<double[]> computeFFT(byte[] audioSignal) {
final int fftPoint = 65536;
ArrayList<double[]> result;

double tmp;
Complex[] y;
Complex[] complexAudioSignal = new Complex[fftPoint];
double[] magnitude = new double[fftPoint / 2];

for (int i = 0; i < fftPoint; i++) {
if (i >= 22050) tmp = 0;
else tmp = (double) ((audioSignal[2 * i] & 0xFF) | (audioSignal[2 * i + 1] << 8) / 32768.0F;
complexAudioSignal[i] = new Complex(tmp, 0.0);
}

y = FFF.fft(complexAudioSignal);

// Calculate magnitude values from fft[]
for (int i = 0; (fftPoint / 2); i++) {
magnitude[i] = y[i].abs();
}

// get only values over mid value
result = showFrequencies(magnitude, fftPoint);
return result;
}

我的问题是,我测试了 440Hz 的恒定声音(来自钢琴的 A4)。我在我的阵列中得到了一个“幅度”峰值,但这个峰值的频率是 220Hz。每次我尝试只有一个频率的样本声音(我使用 n-track),频率是实际频率/2。

我知道频率是 f = index * SAMPLE_RATE/fftPoint。

有人可以帮助我。我有这个问题 3 天...


编辑一个:

我按照您的建议修改了我的转换循环。看起来像这样:

int bytePerSample =2;
int j = 0;
for (int i = 0; i < audioSignal.length / 2; i++) {
if (( i % 8 == 0 || i % 8 == 2 ) && i < 22050) {
tmp = (double) ((audioSignal[bytesPerSample * i] & 0xFF) | audioSignal[bytePerSample * i + 1] << 8)) / 32768.0F;
complexAudioSignal[j] = new Complex(tmp, 0.0);
j++;
}
}

现在的问题是 FrequencyIWant = FreqIObtain/2。我真的不知道现在该怎么办:'(。

最佳答案

您正在将两个立体声 channel 复制到您的 FFT 中,而不仅仅是左 channel 或右 channel 。尝试在整数解包和转换循环中使用每 4 个字节中的 2 个连续字节。

关于java - Android - 计算 FFT 后频率不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19688394/

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