声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1942|回复: 1

[C/C++] 破国产工业软件的困局,从代码开源开始

[复制链接]
发表于 2020-6-18 21:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
​破国产工业软件的困局,还是要从代码开源做起,因此,本账号以后会不定期发布信号处理相关的开源代码。
在这里诚恳希望大家把文章转给在校的学生和软件爱好者们。谢谢!

先看下面这段代码
void fft(float *res,float *data,int n,int size,int sign)
{
int m=log((float)nPts)/log(2.0f)+0.2;
float *x,*y;
int i,j,k,l,n1,n2;
float c,c1,e,s,s1,t,tr,ti;
int *fft_table=fft_array[m-7];
int segLength=n/size;
m+=log((float)segLength)/log(2.0f);
x=new float[n];
y=new float[n];
memset(x,0,n*4);
memset(y,0,n*4);
for(j=0;j<size;j++)
  x[j*segLength]=data[fft_table[j]];
n1=1;
for(l=1;l<=m;l++)
{
  n1=2*n1;
  n2=n1/2;
  e=3.14159265359/n2;
  c=1.0;
  s=0.0;
  c1=cos(e);
  s1=-sign*sin(e);
  for(j=0;j<n2;j++)
  {
   for(i=j;i<n;i+=n1)
   {
    k=i+n2;
    tr=c*x[k]-s*y[k];
    ti=c*y[k]+s*x[k];
    x[k]=x-tr;
    y[k]=y-ti;
    x=x+tr;
    y=y+ti;
   }
   t=c;
   c=c*c1-s*s1;
   s=t*s1+s*c1;
  }
}
if(sign==-1)    //ifft
{
  for(i=0;i<n/2;i++)
  {
   x/=n;
   y/=n;
  }
}
float adjust1=2;       //Hannin window amplitude factor
float adjust=adjust1*2.0f/size*sqrt(1.0f*size/n);
if(m_propData.m_nAmplitude)
  adjust*=sqrt(2.0f);
for(i=0;i<n/2;i++)
  res=sqrt(x*x+y*y)*adjust;
delete x;
delete y;
x=NULL;
y=NULL;
return;
}
总共69行,85个单词
功能就是实现时域到频域的快速傅里叶变换。
OMG,NVH工程师们天天在扯的频率问题,用C语言其实仅仅需要85个单词。
回复
分享到:

使用道具 举报

发表于 2024-6-4 20:29 | 显示全部楼层
不错,如果用matlab做,24行
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-14 20:04 , Processed in 0.048667 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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