Я хотел бы сделать обработку звука в реальном времени с помощью 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);
AmplitudeMax
иPeak
? Также обратите внимание, что ради производительности вы не должны постоянно создавать и уничтожать свой план FFTW — это дорогостоящая операция, и вы должны выполнять ее только один раз для заданного размера БПФ. - person Paul R   schedule 29.07.2014