如何从Tizen上的实时FFT中获得最准确的音频数据?
How do I get most accurate audio frequency data possible from real time FFT on Tizen?
目前我正在开发Tizen IDE。
我已经从麦克风读取输入数据并对其应用FFT…但是每次我得到nan输出
这是我的代码。
ShortBuffer *pBuffer1 = pData->AsShortBufferN();
fft = new KissFFT(BUFFER_SIZE);
std::vector<short> input(pBuffer1->GetPointer(),
pBuffer1->GetPointer() + BUFFER_SIZE); // this contains audio data
std::vector<float> specturm(BUFFER_SIZE);
fft->spectrum(input, specturm);
应用FFT . .
void KissFFT::spectrum(KissFFTO* fft, std::vector<short>& samples2,
std::vector<float>& spectrum) {
int len = fft->numSamples / 2 + 1;
kiss_fft_scalar* samples = (kiss_fft_scalar*) &samples2[0];
kiss_fftr(fft->config, samples, fft->spectrum);
for (int i = 0; i < len; i++) {
float re = scale(fft->spectrum[i].r) * fft->numSamples;
float im = scale(fft->spectrum[i].i) * fft->numSamples;
if (i > 0)
spectrum[i] = sqrtf(re * re + im * im) / (fft->numSamples / 2);
else
spectrum[i] = sqrtf(re * re + im * im) / (fft->numSamples);
AppLog("specturm %d",spectrum[i]); // everytime returns returns nan output
}
}
KissFFTO* KissFFT::create(int numSamples) {
KissFFTO* fft = new KissFFTO();
fft->config = kiss_fftr_alloc(numSamples/2, 0, NULL, NULL);
fft->spectrum = new kiss_fft_cpx[numSamples / 2 + 1];
fft->numSamples = numSamples;
return fft;
}
在fft->config
中应该有一些关于FFT大小的参数,如2048,4096,即2的幂。如果你增加这个值,你可以在频率上得到更高的分辨率。
相关文章:
- FFmpeg av_read_frame从音频流返回数据包
- 捕获音频数据并保存到AudioFlinger中的原始PCM文件
- 如何将 cdparanoia 读取的 CD 音频数据移交给 ALSA 播放器?
- 如何将静默音频数据写入音频流
- 如何在SDL2音频流数据上执行实时FFT
- 使用FFMPEG编写多线程视频和音频数据包
- 数据包大小(每数据包 mBytes)或核心音频中 AAC 文件的比特率
- 以选定的比特率发送音频数据 - 喊播
- 使用C 中的套接字通过网络发送音频数据
- C++将音频数据发送到Linux和Mac OS X上的扬声器输出
- 使用C++(基于C#程序)保存wav文件时,音频数据不正确
- FFmpeg:编码PCM 16音频数据分配错误
- 如何在Raspberry Pi上用C++将接收到的UDP音频数据正确写入ALSA
- 实时录制/转换音频数据到WAV
- 端口音频遍历音频数据
- 在 C++ 中使用 libsndfile 从 WAV 文件中提取原始音频数据
- 如何用音频数据填充AVFrame
- 如何获取 mp3 音频数据包以在 C/C++ 中流式传输
- OpenAL回放捕获的音频数据c++
- 在哪里使用c++和qt将Wav标头添加到实时音频服务器中的数据