dsp的c语言程序为什么需要优化

dsp的c语言程序为什么需要优化,第1张

曾几何时汇编编程是dsp工程师的一张名片。很多人到现在谈起汇编编程还是颇为自豪的,搞得你想说自己不会都要鼓起点勇气——那眼神是恨不得把你送回火星去。这主要是因为在最开始的时候DSP上的C语言编译器不是很普遍,编译器的水平也还在起步阶段,很难用到DSP相应的硬件特性,编译效率值得商榷。而且那时DSP应用场景和复杂度远不比今天,基本上限制在数字信号处理的典型算法上,FFT,FIR,IIR滤波器,等等。这些函数和滤波器的实现相对今天的应用比较简单,用汇编语言也容易突出DSP的硬件特性。还有一个原因是那时候DSP普遍都跑的很慢,基本上在几十兆的水平。这也限制了C语言的使用。试想一下一段C代码跑的比汇编慢十倍,几十兆的DSP一下就变几兆了。

但是今天再来看这所有的一切是完全不一样了。首先是DSP的应用范围越来越广,客户越来越多的希望用同一颗芯片,在同一个平台上实现更多的设计和应用。这对DSP的设计,DSP和MCU的融合都带来重大影响。DSP和MCU之间也不是过往那井水不犯河水的安宁。随着DSP和MCU的主频先后突破1GHz,在很多应用中DSP和MCU相伴相生的场景也开始被一颗强壮的芯代替,或者DSP或者MCU。在这样的应用中, *** 作系统,文件系统,USB协议栈,TCP/IP,海量数据存储,样样都会用到。数字信号处理也从骨灰级的滤波器变成全系列音视频处理,OFDM基带处理,天线阵列信号处理,彩色图像重建… 试想一下这些应用哪一个不是成千上万行代码。汇编语言在编程复杂度,可移植性和可维护性上真的是遇到了前所未有的挑战。而与此相对应的是C语言和C语言编译器的蓬勃发展。今天您可以很容易找到上面提到所有这些应用和算法的C语言实现,而C语言编译器在编译效率和成熟度上都有很大的突破。也让C语言在DSP上的应用得以受到愈来愈高的重视。

何编程语言是难学的,真正的工作中有时候学习一个新语法只有不到一周的时间,语法而言都一样,如果还停留在语法层学习的上面,编写程序的道路你就连门都没有入.

但是后续的 数据结构和算法 稍微要看下书了,开始接触算法了,着和语法没有关系,之所以要先学好语法是为了能看懂用语法描叙的算法,学通了用任何语言来描叙都一样,到了这个阶段的就相当于抬起一条腿准备跨到起跑线一样,但还是没有入门.

到编译原理 和 图灵机 再到 自己编写微型的 *** 作系统 就需要有个老师来引导了

我学软件开发就是从C开始一路由 ->国家数据库3级->程序员->高级程序员->系统分析师考上去然后通过近9年的工作,体会是如果你能够在市面上或者学校里精确买到或者学到的一门知识往往就表示你的层次还是不能让你得兴应手的在行业中创造你能想像的东西,真正的解决问题需要很多本书再加上80%以上的自己创造和理解才能做出来的时候才算真正懂得了你的工作.

一个程序员需要这样的经历

楼上的估计最高学历不过是理工科的一个大学生,应该还没毕业,没有在计算机行业呆过,在做芯片处理的工作中比如DSP芯片设计需要你天天接触算法,但是这和C语言本身有关系吗?傅立叶算法是数学家傅立叶设计出来的数学模型但是不适合做在计算机软件里面(运算量太大了比如离散的傅立叶变换等同于用序列Y(n×1列矢量)乘以n×n矩阵Fn,需要n×n次乘法。若n=1024,则是104,8576次乘法运算。什么概念呢?如果你选用的CPU单周期指令为25ns, 单周期也可以完成一次乘法运算,那么要计算1024点的傅立叶变换则需要26.2144ms,这还不包括加法或其它运算),我给出C算法如下:

void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)

{

int it,m,is,i,j,nv,l0

double p,q,s,vr,vi,poddr,poddi

for (it=0it<=n-1it++)

{

m = it

is = 0

for(i=0i<=k-1i++)

{

j = m/2

is = 2*is+(m-2*j)

m = j

}

fr[it] = pr[is]

fi[it] = pi[is]

}

//----------------------------

pr[0] = 1.0

pi[0] = 0.0

p = 6.283185306/(1.0*n)

pr[1] = cos(p)

pi[1] = -sin(p)

if (l!=0)

pi[1]=-pi[1]

for (i=2i<=n-1i++)

{

p = pr[i-1]*pr[1]

q = pi[i-1]*pi[1]

s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1])

pr[i] = p-q

pi[i] = s-p-q

}

for (it=0it<=n-2it=it+2)

{

vr = fr[it]

vi = fi[it]

fr[it] = vr+fr[it+1]

fi[it] = vi+fi[it+1]

fr[it+1] = vr-fr[it+1]

fi[it+1] = vi-fi[it+1]

}

m = n/2

nv = 2

for (l0=k-2l0>=0l0--)

{

m = m/2

nv = 2*nv

for(it=0it<=(m-1)*nvit=it+nv)

for (j=0j<=(nv/2)-1j++)

{

p = pr[m*j]*fr[it+j+nv/2]

q = pi[m*j]*fi[it+j+nv/2]

s = pr[m*j]+pi[m*j]

s = s*(fr[it+j+nv/2]+fi[it+j+nv/2])

poddr = p-q

poddi = s-p-q

fr[it+j+nv/2] = fr[it+j]-poddr

fi[it+j+nv/2] = fi[it+j]-poddi

fr[it+j] = fr[it+j]+poddr

fi[it+j] = fi[it+j]+poddi

}

}

if(l!=0)

for(i=0i<=n-1i++)

{

fr[i] = fr[i]/(1.0*n)

fi[i] = fi[i]/(1.0*n)

}

if(il!=0)

for(i=0i<=n-1i++)

{

pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i])

if(fabs(fr[i])<0.000001*fabs(fi[i]))

{

if ((fi[i]*fr[i])>0)

pi[i] = 90.0

else

pi[i] = -90.0

}

else

pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306

}

return

}

另外,虚机团上产品团购,超级便宜


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7776966.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-09
下一篇2023-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存