почему основная частота и величина не равны нулю, когда микрофон выключен?

Я хотел бы сделать обработку звука в реальном времени с помощью Qt и отобразить спектр с помощью FFTW3.

Что я сделал по шагам:

Я захватываю любой звук с компьютерного устройства и заливаю его в буфер. Я назначаю звуковые образцы двойному массиву. Я вычисляю основную частоту. когда я показываю основную частоту и магнитное поле, когда микрофон включен, но нет сигнала (тишина), основная частота не такая, как я ожидал, код не всегда возвращает ноль, иногда код возвращает 1500 Гц, 2000 Гц в качестве частоты и когда микрофон выключен (без звука), код не возвращает ноль в качестве основной частоты, а возвращает число от 0 до 9000 Гц. Любая помощь будет оценена вот мой код

  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);

person The Man    schedule 28.07.2014    source источник
comment
Вместо того, чтобы использовать реальный сигнал, вы проводили тесты стандартных сигналов в файлах (sin@xHz)?   -  person TimSPQR    schedule 29.07.2014
comment
Во-первых, является ли ваше молчание истинным молчанием? i.e Заполнен ли аудиовход нулями при отсутствии входного сигнала?   -  person KillaKem    schedule 29.07.2014
comment
@KillaKem, когда микрофон выключен (без звука), это означает настоящую тишину, аудиовход заполнен множеством нулей, но также заполнен большим числом, например 4000, 6000 или числом -1. Я не знаю, откуда взялось это большое число   -  person The Man    schedule 29.07.2014
comment
Где вы инициализируете AmplitudeMax и Peak ? Также обратите внимание, что ради производительности вы не должны постоянно создавать и уничтожать свой план FFTW — это дорогостоящая операция, и вы должны выполнять ее только один раз для заданного размера БПФ.   -  person Paul R    schedule 29.07.2014
comment
@PaulR, я отредактировал код, я инициализирую AmplitudeMax и Peak внутри секунды для итераций. Каждый раз, когда я вызываю пик функции, я создаю и уничтожаю свой FFTW, это неправильно? или что означает, когда вы говорите, что я должен уничтожить и создать один раз для заданного размера FFT?   -  person The Man    schedule 29.07.2014
comment
Извините - меня сбило с толку отсутствие форматирования - я думал, что вы создаете/уничтожаете план внутри цикла.   -  person Paul R    schedule 29.07.2014


Ответы (1)


То, что вы считаете тишиной, может содержать небольшое количество шума. БПФ случайного шума также будет казаться случайным и, таким образом, будет иметь пик случайной величины. Но возможно, что шум может исходить от оборудования или электроники в окружающей среде (вентиляторы, обратноходовые трансформаторы и т. д.) или от источника питания вашего АЦП или микрофона, что свидетельствует о некоторых смещениях частоты.

Если уровень шума достаточно низок, обычно проверяют уровень пика магнитуды, сравнивают его с пороговым значением и отсекают отчет об оценке частоты ниже этого порога.

person hotpaw2    schedule 29.07.2014
comment
когда микрофон выключен (без звука), это означает настоящую тишину, аудиовход заполнен множеством нулей, но также заполнен большим числом, например, 4000, 6000 или числом -1. Я не знаю, откуда взялось это большое число - person The Man; 29.07.2014