硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3596|回复: 5
收起左侧

[DSP] STM32 音乐频谱分析

[复制链接]

4

主题

17

回帖

4

积分

新手上路

积分
4
发表于 2017-7-18 17:50:08 | 显示全部楼层 |阅读模式
@站长 您好,
    想向您请教下STM32 音频的FFT相关知识。 我想将采集到的原始音频数据(16bit)转换成频率形式 根据不同的音乐频率处理不同的事情,我现在的做法如下:
   
1.初始化FFT
  1. arm_cfft_radix4_instance_f32 scfft;
  2. [backcolor=#ffffff][color=#008ef1]arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);[/color][/backcolor]
复制代码
2. FFT计算
  1. #define FFT_LENGTH      64 //1024        //FFT长度,默认是1024点FFT
  2. float fft_inputbuf[FFT_LENGTH*2];   //FFT输入数组
  3. float fft_outputbuf[FFT_LENGTH];    //FFT输出数组
  4. /* 将原始音频数据转换成浮点型 */
  5.                 for(i=0;i<FFT_LENGTH;i++) { //生成信号序列
  6.    fft_inputbuf[2*i] = (float32_t)i2srecbuf1[i];   //生成输入信号实部
  7. [backcolor=#ffffff]   [/backcolor][backcolor=#f7f7f7]fft_inputbuf[2*i+1]=0;                              //虚部全部为0[/backcolor]
  8.                 }
  9.                 arm_cfft_radix4_f32(&scfft, fft_inputbuf);  //FFT计算(基4)
  10.                 arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);  //把运算结果复数求模得幅值
  11.                 for(i=0; i<FFT_LENGTH; i++) {
  12.     printf("fft_outputbuf[%d]:%f\r\n",i,fft_outputbuf[i]);
  13. [backcolor=#f7f7f7]}[/backcolor]
复制代码
其中,音频采样频率为48KHz,DMA接收的音频数据为64个,频率分辨率为48000/64=750;
我想请教下:
1、arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH)中fft_outputbuf求得的模值可以与音频频率有什么关系?
2、我的录音数据是按照你那边来的,验证过了,没有问题,但是发现,audio codec插入耳机和没有插入耳机的fft_outputbuf差别不是很大,
3、怎么才能根据fft_outputbuf分析出音乐播放时产生的不同频率呢?


下面上传下我的fft_outputbuf的平均值:
64个fftout平均值.txt (5 KB, 下载次数: 77)



希望能帮我分析下,感谢!!!

回复

使用道具 举报

4

主题

17

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-7-18 17:51:30 | 显示全部楼层
11行后面的代码完整的如下
                arm_cfft_radix4_f32(&scfft, fft_inputbuf);  //FFT计算(基4)
                arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);  //把运算结果复数求模得幅值
                for(i=0; i<FFT_LENGTH; i++) {
                    //printf("fft_outputbuf[%d]:%f\\r\\n",i,fft_outputbuf);
                    avr += fft_outputbuf;
                }
                avr /= FFT_LENGTH;
                printf("fft average:%f\\r\\n", avr);
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-7-19 01:32:42 | 显示全部楼层
如果你要是显示频谱的话,搞个64点可以的,如果是音频分析的话,不行,分辨率太低,搞个2048点好点。

这个采样点数分析音频频率很方便的。
回复

使用道具 举报

4

主题

17

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-7-19 17:00:11 | 显示全部楼层
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);认有5种不同的设置,分别是(16/64/256/1024/4096) 我现在选的是1024 ; 但是现在是没有外部音乐输入的情况下FFT变换求模的结果跟输入音乐后FFT变换后的结果 没有明显差异 。
回复

使用道具 举报

4

主题

17

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-7-19 17:00:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:如果你要是显示频谱的话,搞个64点可以的,如果是音频分析的话,不行,分辨率太低,搞个2048点好点。

这个采样点数分析音频频率很方便的。 (2017-07-19 01:32) 
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);认有5种不同的设置,分别是(16/64/256/1024/4096) 我现在选的是1024 ; 但是现在是没有外部音乐输入的情况下FFT变换求模的结果跟输入音乐后FFT变换后的结果 没有明显差异 。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-7-20 10:31:48 | 显示全部楼层

回 ygcldrz 的帖子

ygcldrz:arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);认有5种不同的设置,分别是(16/64/256/1024/4096) 我现在选的是1024 ; 但是现在是没有外部音乐输入的情况下FFT变换求模的结果跟输入音乐后FFT变换后的结果 没有明显差异 。 (2017-07-19 17:00) 
想办法动态显示下频谱,方便观察。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 14:29 , Processed in 0.174488 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表