|
本帖最后由 airqj 于 2014-7-20 22:08 编辑
老天这回可别把我辛辛苦苦写出来的好一大段字弄没了,可不想加班到半夜,明天还要上班呢![]()
上一帖子说道波形的显示,这里要说的就是频谱仪的主要功能了--绘制频谱图。
大家都知道,要得到波形的频谱就得对信号做FFT。当初在学习FFT的时候可花了不少时间,自己也曾经自己实现了一下,可惜效果不好。就在想着不会还要让俺用汇编实现吧,网上查资料的时候发现了好东西fftw,这东西性能不错,可以根据处理器在运行的时候自动优化代码,特别是像俺做的这个频谱仪,因为在运算的时候不会对参数做太多的改变,fftw的性能这就体现出来了。关于fftw在BBB上的移植可以参考我之前的帖子https://bbs.eeworld.com.cn/thread-435319-1-1.html。由于咱们的BBB是支持硬件浮点数计算的,所以可以将ARM_FLOAT_ABI改为hard。
频谱仪中fft的相关代码- read_size= read(soundcardfd,&buffer,sizeof(buffer));
- buf_ptr=&buffer;
- for(int i=0;i<N_FFT;i++)
- {
- float_buffer[i]=(float)(*buf_ptr)/65536.0;
- buf_ptr+=1;
- }
- if(fft_flag)
- {
- buf_fft_ptr=&buffer;
- for(i=0;i<N_FFT;i++)
- {
- in[i][0]=(float)((*buf_fft_ptr)/256.0);
- in[i][1]=0.0;
- buf_fft_ptr++;
- }
- fftwf_execute(plan);
- float_buffer[0]=sqrt(pow(out[0][0],2)+pow(out[0][1],2))/(float)N_FFT;
- for(i=1;i<N_FFT;i++)
- {
- float_buffer[i]=sqrt(
- pow(out[i][0],2) +
- pow(out[i][1],2)
- );
- // printf("%f\n",float_buffer[i]);
- }
- // printf("%f\n",float_buffer[2]);
- // printf("%f\n",float_buffer[2046]);
- fflush(stdout);
复制代码 printf主要是用于调试用的,大家可以忽略。关于fftw具体如何使用,可以参考官方文档http://www.fftw.org/#documentation
这里为了将全部的音频信息显示出来就没有只读取低八位,而是全部读取。而且fft输出相对与波形信号来说大小变化不会很大
这个是属于服务端的程序的,就是将前面所说的波形信号进行FFT变换后根据fft储存到Qt显示波形的数组中。具体请看fft的物理意义
有什么疑欢迎大家提出
|
赞赏
-
1
查看全部赞赏
-
|