最近项目里碰到个问题,原本在STM32中可以跑完的程序,在GD32中却完全跑不完。解释下什么是跑完:我的程序需要在一个I2S DMA中断周期内完成所有对音频信号处理的工作,其中包含一些滤波器,使用了很大的参数数组,数组以const long形式编译,自然这些数组就会被存放进flash区,然后我的滤波器程序会调用这些数组的值进行运算,数组形式是const long X[64][32][16]这样,也就是有64*32*16*32bit的数据,这样的数组总共有4个,那么数组总大小将是64*32*16*32bit*4=4194304bit
我传了几个附件上来,附件中我把这个滤波器的参数头文件传上来,求有兴趣的大神给分析下
附件中 b0.h b1.h b2.h a2.h中存放的是滤波器的参数
下面的可作为测试程序
//////////////////////////////////////////////////////////////
//程序输入输出范围是 -32768 --- 0 --- 32767
//fc取0-63,g取0-31
参数.rar
(269.75 KB)
//这是个音频EQ程序,中心频率(fc)可调,+/-12dB增益(g),的采样率44.1K
///////////////////////////////////////////////////////////////
#include "b0.h"
#include "b1.h"
#include "b2.h"
#include "a2.h"
unsigned char fc=0;
unsigned char g=0;
long fitXz1=0;
long fitXz2=0;
long fitYz1=0;
long fitYz2=0;
short IIR(short DataIn)
{long in,out;
in =(long)DataIn;
out=((((long long)(b0[fc][g][0]))*in )>>15)
+((((long long)(b1[fc][g][0]))*fitXz1)>>15)
+((((long long)(b2[fc][g][0]))*fitXz2)>>15)
-((((long long)(b1[fc][g][0]))*fitYz1)>>15)
-((((long long)(a2[fc][g][q]))*fitYz2)>>15);
fitXz2 = fitXz1;
fitXz1 = in;
fitYz2=fitYz1;
fitYz1=out;
if(out> 32767){out= 32767;}
if(out<-32767){out=-32767;}
return (short)out;
}
/////////////////////////////////////////////////////////////
|