使用Qwt / FFTW3计算和显示频谱?

时间:2014-07-13 08:26:00

标签: c++ qt audio fftw qwt

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

  • 我在步骤中做了什么:

    1. 我从计算机设备捕获任何声音并将其填入缓冲区。
    2. 我将声音样本分配给双数组
    3. 我计算基频。

问题:

  • 光谱上出现斜/直线
  • 我发现这些直线对应于缓冲区中的最大样本
  • 和最大频率

这是我的代码和光谱图像

signal1 signal2

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++) {
    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);
    const QPointF s2(f, t);
    SignalData::instance(2).append( s2 );
}

fftw_destroy_plan(p3);

return 0;

0 个答案:

没有答案