实时音频处理
Real time audio processing
我想让实时音频处理与Qt和显示基频使用FFTW3。
我所做的步骤:
- 我从计算机设备捕获任何声音并将其填充到缓冲区。
- 我将声音样本分配给
double
阵列 - 计算基频。
我的代码总是返回0作为基频。
QByteArray *buffer;
QAudioInput *audioInput;
audioInput = new QAudioInput(format, this);
//Check the number of samples in input buffer
qint64 len = audioInput->bytesReady();
//Limit sample size
if(len > 4096)
len = 4096;
//Read sound samples from input device to buffer
qint64 l = input->read(buffer.data(), len);
if(l > 0)
{
int input_size = BufferSize;
// Compute corresponding number of complex output samples
int output_size = (input_size/2 + 1);
double *input_buffer = static_cast<double*>(fftw_malloc(input_size * sizeof(double)));
fftw_complex *out = static_cast<fftw_complex*>(fftw_malloc(output_size * sizeof(fftw_complex)));
//Assign sound samples to double array
input_buffer = (double*)buffer.data();
fftw_plan p3;
//Create plan
p3 = fftw_plan_dft_r2c_1d(input_size, input_buffer, out, FFTW_ESTIMATE);
fftw_execute(p3);
double reout[BufferSize];
double imgout[BufferSize];
double magnitude[BufferSize/2];
long ffond = 0.0; // Position of the frequency
double max = 0; // Maximal amplitude
for (int i = 0; i < BufferSize/2; i++)
{
reout[i] = out[i][0];
imgout[i] = out[i][1];
cout << imgout[i] << endl;
magnitude[i] = sqrt(reout[i]*reout[i] + imgout[i]*imgout[i]); //Calculate magnitude of first
double t = sqrt(reout[i]*reout[i] + imgout[i]*imgout[i]);
if(t > max)
{
max = t;
ffond = i;
}
}
qDebug() << "fundamental frequency is :" << QString::number(ffond*static_cast<double>);
fftw_destroy_plan(p3);
我可以看到你有两个紧迫的问题:
-
你没有应用窗函数,所以会有相当大的频谱泄漏和相关的频谱"涂抹"(可能是一个大的直流(0 Hz)组件与相关的"裙边")
-
你假设频谱中最大的幅度是基频,这很可能是不正确的,原因有两个:(a)你可能有一个大的0 Hz分量,大于你的基频或谐波;(b)根据你试图分析的声音的性质,基频的幅度可能比谐波小(它甚至可能完全缺失)
我建议你这样做:
-
在FFT之前应用合适的窗口函数-这应该使您的峰值更好地定义,并且应该减少0 Hz和刚好高于
的伪影 从适当的bin而不是0开始搜索,例如,如果您感兴趣的最小基频是50 Hz,那么从相应的bin开始搜索50 Hz,而不是0
添加一个调试选项以图形方式显示频谱-当你想知道为什么你的结果不合理时,这个可视化的调试辅助将大有帮助
如果你真正想测量的是基音而不是基频,那么请仔细阅读基音检测算法,例如谐波产品频谱-这将比naïve尝试识别基频(其频率在一般情况下与基音不相同)的方法要好得多
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如何在音频处理中使用超能力时间拉伸类
- 媒体基金会:WavSink以比实时消耗率更快的速度处理音频-是否可以实时限制后台处理
- C++ 是使用 OpenAL 进行实时 PCM fft 音频处理
- 音频样本的FFT处理
- 音频处理C++ - FFT
- 进一步了解端口音频信号的 fftw 处理
- 如何正确处理音频中断
- 独立处理音频和视频
- 解码音频和视频并处理这两个流——ffmpeg、sdl、opencv
- 在Android中有像OpenCV这样的音频处理库吗?
- 实时音频处理
- 如何处理在使用libpd时不能被64整除的音频缓冲区大小
- 实时音频处理
- 24位音频处理
- WebRTC音频处理模块(APM),并计算回放设备的回声延迟
- 处理线性上采样音频阵列
- Port音频处理立体声