STM32 音乐频谱分析
@站长 您好,想向您请教下STM32 音频的FFT相关知识。 我想将采集到的原始音频数据(16bit)转换成频率形式 根据不同的音乐频率处理不同的事情,我现在的做法如下:
1.初始化FFT
arm_cfft_radix4_instance_f32 scfft;
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);2. FFT计算#define FFT_LENGTH 64 //1024 //FFT长度,默认是1024点FFT
float fft_inputbuf; //FFT输入数组
float fft_outputbuf; //FFT输出数组
/* 将原始音频数据转换成浮点型 */
for(i=0;i<FFT_LENGTH;i++) { //生成信号序列
fft_inputbuf = (float32_t)i2srecbuf1; //生成输入信号实部
fft_inputbuf=0; //虚部全部为0
}
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);
}
其中,音频采样频率为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的平均值:
希望能帮我分析下,感谢!!!
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); 如果你要是显示频谱的话,搞个64点可以的,如果是音频分析的话,不行,分辨率太低,搞个2048点好点。
这个采样点数分析音频频率很方便的。 arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);认有5种不同的设置,分别是(16/64/256/1024/4096) 我现在选的是1024 ; 但是现在是没有外部音乐输入的情况下FFT变换求模的结果跟输入音乐后FFT变换后的结果 没有明显差异 。
回 eric2013 的帖子
eric2013:如果你要是显示频谱的话,搞个64点可以的,如果是音频分析的话,不行,分辨率太低,搞个2048点好点。这个采样点数分析音频频率很方便的。 (2017-07-19 01:32) images/back.gif
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);认有5种不同的设置,分别是(16/64/256/1024/4096) 我现在选的是1024 ; 但是现在是没有外部音乐输入的情况下FFT变换求模的结果跟输入音乐后FFT变换后的结果 没有明显差异 。
回 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) images/back.gif想办法动态显示下频谱,方便观察。
页:
[1]