初级会员

- 积分
- 54
- 金钱
- 54
- 注册时间
- 2019-10-24
- 在线时间
- 11 小时
|
1金钱
本帖最后由 科技骏马 于 2019-10-27 08:27 编辑
我把codec2移植到STM32F409+CubeMX+freeRTOS+fatfs,开发板不是原子的,是杂牌的,从SD卡上读取raw语音,用450bps编码后再写到SD卡,在电脑上解码后听不清,用电脑编码的同一段声音再用电脑解码还能听清。我调试中发现最初与电脑运行过程有分歧的是make_analysis_window函数中codec2_fft的结果W数组,可能是arm_cfft_f32与kiss_fft有差异造成的,但是执行analyse_one_frame中dft_speech的codec2_fft_inplace里面也有arm_cfft_f32,结果都与电脑执行结果相同。我贴一下核心代码,在sine.c中
- void make_analysis_window(C2CONST *c2const, codec2_fft_cfg fft_fwd_cfg, float w[], COMP W[])
- {
- float m;
- COMP wshift[FFT_ENC];
- COMP temp;
- int i,j;
- int m_pitch = c2const->m_pitch;
- int nw = c2const->nw;
- //这里删除了一些注释
- m = 0.0;
- for(i=0; i<m_pitch/2-nw/2; i++)
- w[i] = 0.0;
- for(i=m_pitch/2-nw/2,j=0; i<m_pitch/2+nw/2; i++,j++) {
- w[i] = 0.5 - 0.5*cosf(TWO_PI*j/(nw-1));
- m += w[i]*w[i];
- }
- for(i=m_pitch/2+nw/2; i<m_pitch; i++)
- w[i] = 0.0;
- /* Normalise - makes freq domain amplitude estimation straight
- forward */
- m = 1.0/sqrtf(m*FFT_ENC);
- for(i=0; i<m_pitch; i++)
- w[i] *= m;
- //这里删除了一些注释
- for(i=0; i<FFT_ENC; i++) {
- wshift[i].real = 0.0;
- wshift[i].imag = 0.0;
- }
- for(i=0; i<nw/2; i++)
- wshift[i].real = w[i+m_pitch/2];
- for(i=FFT_ENC-nw/2,j=m_pitch/2-nw/2; i<FFT_ENC; i++,j++)
- wshift[i].real = w[j];
- codec2_fft(fft_fwd_cfg, wshift, W);//这里开始进入codec2_fft.h的内联函数,这里出错了
- //这里删除了一些注释
- for(i=0; i<FFT_ENC/2; i++) {
- temp.real = W[i].real;
- temp.imag = W[i].imag;
- W[i].real = W[i+FFT_ENC/2].real;
- W[i].imag = W[i+FFT_ENC/2].imag;
- W[i+FFT_ENC/2].real = temp.real;
- W[i+FFT_ENC/2].imag = temp.imag;
- }
- }
复制代码 在codec2_fft.h中,USE_KISS_FFT未定义,执行宏定义else中的语句
- static inline void codec2_fft(codec2_fft_cfg cfg, codec2_fft_cpx* in, codec2_fft_cpx* out)
- {
- #ifdef USE_KISS_FFT
- kiss_fft(cfg, (kiss_fft_cpx*)in, (kiss_fft_cpx*)out);
- #else
- memcpy(out,in,cfg->instance->fftLen*2*sizeof(float));
- arm_cfft_f32(cfg->instance,(float*)out,cfg->inverse, 1);
- //这里删除了一些注释
- if (cfg->inverse)
- {
- arm_scale_f32((float*)out,cfg->instance->fftLen,(float*)out,cfg->instance->fftLen*2);
- }
- #endif
- }
复制代码
需要完整代码的,请查看附件
|
|