qt - 为什么麦克风关闭时基本频率和幅度不为零?

标签 qt audio fft frequency fftw

我想使用Qt进行实时音频处理,并使用FFTW3显示频谱。

我逐步完成的工作:

我捕获了计算机设备发出的任何声音并将其填充到缓冲区中。
我将声音样本分配给双数组
我计算基本频率。
当我打开麦克风但没有信号(静音)时显示基频和Magnetitude时,基频不是我所期望的,代码并不总是返回零,有时代码返回1500Hz,2000hz作为频率
当麦克风关闭(静音)时,代码不会以零为基频返回零,而是返回0到9000Hz之间的数字。任何帮助将不胜感激
这是我的代码

  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);
 int input_size= BufferSize;
 int output_size = input_size; //input_size/2+1;
  fftw_plan p3;
 double in[output_size];
  fftw_complex out[output_size];

 short *outdata = (short*)m_buffer.data();// assign sample into short array
 int data_size = size_t(outdata);
  int data_size1 = sizeof(outdata);

 int count = 0;
  double w = 0;

 for(int i(chanelNumber); i < output_size/2; i= i + 2) //fill array in
 {

w= 0.5 * (1 - cos(2*M_PI*i/output_size)); // Hann Windows 
double x = 0;
if(i < data_size){
    x = outdata[i];
}
if(count < output_size){
  in[count] = x;// fill Array In with sample from buffer 
  count++;
}
}

for(int i=count; i<output_size; i++){
in[i] = 0;
}
p3 = fftw_plan_dft_r2c_1d(output_size, in, out, FFTW_ESTIMATE);// create Plan 
 fftw_execute(p3);// FFT
 for (int i = 0; i < (output_size/2); i++) {
 long peak=0;
 double Amplitudemax=0;
double r1 = out[i][0] * out[i][0];
double im1 = out[i][3] * out[i][4];
double t1 = r1 + im1;
//double t = 20*log(sqrt(t1));
double t = sqrt(t1)/(double)(output_size/2);
double f = (double)i*8000  / ((double)output_size/2);
   if(Magnitude > AmplitudeMax)
           {
               AmplitudeMax = Magnitude;
               Peak =2* i;
            }
 }

fftw_destroy_plan(p3);

 return Peak*(static_cast<double>(8000)/output_Size);

最佳答案

您认为沉默可能包含少量的噪音。随机噪声的FFT也将呈现随机性,因此具有随机幅度峰值。但是,噪声可能来自环境中的设备或电子设备(风扇,反激式变压器等)或ADC或麦克风的电源,从而显示出一些频率偏差。

如果噪声水平足够低,通常会检查幅度峰值的水平,将其与阈值进行比较,并切断报告低于此阈值的频率估计。

关于qt - 为什么麦克风关闭时基本频率和幅度不为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005127/

相关文章:

c++ - 检查 qtreewidgetitem 复选框是否被选中

multithreading - 如何使用QThreadPool取消线程

asp.net - MySql 音频库

signal-processing - 两个信号之间的相位差?

c - 试图解决 C 中未知的段错误

matlab - 使用 fft 查找每个谐波的相位

c++ - Qt:如何访问 WebKit 页面上的实际小部件?

qt - 如何子类化 QSpinBox 以便它可以将 int64 值作为最大值和最小值

actionscript-3 - AS3 AIR在线加载mp3-错误#2044:未处理的IOErrorEvent:

java - 如何使用Java AudioSystem.write保存多于一个字节的数组