百度贴吧 > 傅立叶 > 浏览贴子
吧主: liuzhichao123
  • 共有23篇贴子

反卷积程序

1楼

#include<stdio.h>
#include <math.h>
void dft(double x[],double y[],double a[],double b[],int n,int sign);

void main()
{FILE *fp;
int i,j;
float dt=0.002;
float r[200],t;
float ri[200];
float x[200];
double f0,zb[31],Br[31],Bi[31],Ar[31],Ai[31],za[31],temp[31],pi;
double alfa;
int n,m;
f0=35.0;
pi=3.14159;


if((fp=fopen("c_deltat.txt","r"))==NULL)
printf("Can't open file.\n");
else
{
for(i=0;i<200;i++)
{ fscanf(fp,"%f",&r[i]); 

}
}  

//--------------------------------------------//
alfa=(f0*f0*log(1.8))*2.0;
printf("%lf",alfa);
for(i=0;i<31;i++)
{zb[i]=sin(2*pi*f0*i*dt)*exp(-alfa*(i*dt)*(i*dt));
 //printf("%f\n",b[i]);
}

for(i=0;i<200;i++)
     x[i]=0;

//计算卷积
for(n=0;n<198;n++)
{for(m=0;m<31;m++)
   if((n-m>=0)&&(n-m<198)) x[n]=x[n]+zb[m]*r[n-m]; 
          }
 

for(i=0;i<31;i++) temp[i]=0.0;
for(i=0;i<31;i++) Ar[i]=0.0;
for(i=0;i<31;i++) Ai[i]=0.0;
for(i=0;i<31;i++) Br[i]=0.0;
for(i=0;i<31;i++) Bi[i]=0.0;
for(i=0;i<31;i++) za[i]=0.0;

dft(zb,temp,Br,Bi,31,1);

for(i=0;i<31;i++) Ar[i]=1.0/Br[i];
for(i=0;i<31;i++) Ai[i]=1.0/Bi[i];

//计算傅立叶反变换
dft(Ar,Ai,za,temp,31,-1);

//计算反褶积
for(i=0;i<200;i++)
     ri[i]=0;

for(n=0;n<200;n++)
{for(m=0;m<31;m++)
   if((n-m>=0)&&(n-m<200)) ri[n]=ri[n]+za[m]*x[n-m]; 
          }

if((fp=fopen("hecheng.txt","w"))==NULL)
printf("Can't open file.\n");
else
{for(i=0;i<200;i++)
fprintf(fp,"%f\n",x[i]);  
}
fclose(fp);


if((fp=fopen("zibo.txt","w"))==NULL)
printf("Can't open file.\n");
else
{for(i=0;i<31;i++)
fprintf(fp,"%f\n",za[i]);  
}
fclose(fp);

//输出反卷积结果
if((fp=fopen("fanzheji.txt","w"))==NULL)
printf("Can't open file.\n");
else
{for(i=0;i<200;i++)
fprintf(fp,"%f\n",ri[i]);  
}
fclose(fp);

}

/************************************************************************ 
* 离散傅立叶变换与反变换 
* 输入: x--要变换的数据的实部 
*       y--要变换的数据的虚部 
*       a--变换结果的实部 
*       b--变换结果的虚部 
*       n--数据长度 
*       sign--sign=1时,计算离散傅立叶正变换;sign=-1时;计算离散傅立叶反变换 
************************************************************************/ 
void dft(double x[],double y[],double a[],double b[],int n,int sign) 

int i,k; 
double c,d,q,w,s; 

q=6.28318530718/n; 
for(k=0;k<n;k++) 

 w=k*q; 
 a[k]=b[k]=0.0; 
   for(i=0;i<n;i++) 
   { 
     d=i*w; 
     c=cos(d); 
     s=sin(d)*sign; 
     a[k]+=c*x[i]+s*y[i]; 
     b[k]+=c*y[i]-s*x[i]; 
   } 

if(sign==-1) 

c=1.0/n; 
  for(k=0;k<n;k++) 
  { 
  a[k]=c*a[k]; 
  b[k]=c*b[k]; 
  } 



      2楼

      以下是我的看法,我也在做这方面的设计啊,但是还不是很会呢,希望你能指教~
      fp=fopen("c_deltat.txt","r"))
      c_deltat.txt 这个文件是实时输入吗?还是事先写好的?
      如果实时输入的话,最多200个数,要太久了吧~

      zb[i]=sin(2*pi*f0*i*dt)*exp(-alfa*(i*dt)*(i*dt)); 
       //printf("%f\n",b[i]);
      这里没问题吗?原先是zb[i],怎么说明部分是打印b[i]?

      for(i=0;i<200;i++) 
       x[i]=0;
      x[i]是浮点型的,应该是x[i]=0.0;吧?

      【dft(zb,temp,Br,Bi,31,1); 

      for(i=0;i<31;i++) Ar[i]=1.0/Br[i]; 
      for(i=0;i<31;i++) Ai[i]=1.0/Bi[i]; 

      //计算傅立叶反变换 
      dft(Ar,Ai,za,temp,31,-1); 】
      这几段的意思是调用函数本身吗?
      反褶积存在ri[]中吗?

      【void dft(double x[],double y[],double a[],double b[],int n,int sign)】这个函数要重新建个文件,那文件名取什么呢?是取dft.c吗?还有,请问怎么把这个离散傅立叶变换和反变换算法改成只针对实数的?(也就是没有虚部)

      我有一些还不是很懂啊~,这些只是我个人的意见,错了的请指正~~~


          3楼

          不好意思,没仔细看哦。
          【dft(zb,temp,Br,Bi,31,1); 

          for(i=0;i<31;i++) Ar[i]=1.0/Br[i]; 
          for(i=0;i<31;i++) Ai[i]=1.0/Bi[i]; 

          //计算傅立叶反变换 
          dft(Ar,Ai,za,temp,31,-1); 】 
          这里是调用下面的函数dft吧,这样就能做反卷积了?
          【for(i=0;i<31;i++) Ar[i]=1.0/Br[i];】万一分母是0怎么办呢?


          dft()函数是这个大程序的一部分啊~我以为是另一个c文件呢,请问你是用vc6.0吗?


              4楼

              我的程序有一些不对的地方,我已经修改了,你要的话,我可以发给你.


                  5楼

                  那就麻烦你发给我看看好吗?
                  谢谢啊~~
                  huhuhuhuhu_hp@163.com


                      218.26.171.*

                      6楼

                      能给我发个吗?急用谢谢!!!
                      6ba6@163.com


                          7楼

                          能发我一个吗?急用,谢谢
                          alphahua@126.com


                              38.112.100.*

                              8楼

                              can I have it too?
                              bqqq@263.sina.com


                                  9楼

                                  您能发给我一个吗?谢谢先了
                                  jww100@hotmail.com


                                      222.210.217.*

                                      10楼

                                      能给我也发个吗?谢谢
                                      cool.ljd@163.com


                                          218.199.85.*

                                          11楼

                                          能给我也发一个么?非常感谢~~正做这个头疼呢,看到你的帖子真是太好了
                                          honeyjc0@163.com


                                              219.239.98.*

                                              12楼

                                              能不能也给我发一个?谢谢了,急用。guokai6662004@yahoo.com.cn


                                                  219.139.145.*

                                                  13楼

                                                  能给我也发一个么?非常感谢!正做这个头疼呢,看到你的帖子真是great了.sky88521@163.com


                                                      14楼

                                                      能给我也发一个么?非常感谢!学习一下,正做这个呢。chunsheng22@163.com


                                                          15楼

                                                          楼主能发给我一份吗?miaodingyi1986@vip.qq.com


                                                              16楼

                                                              楼主能发给我一份吗?谢谢!universedayu@hotmail.com


                                                                  17楼

                                                                  能发给我一份吗?谢谢!zhaoying5558@126.com


                                                                      114.222.46.*

                                                                      18楼

                                                                      楼主 能发我一份吗 ?谢谢您了 我的邮箱:1074290496@qq.com
                                                                      谢谢了 呵呵


                                                                          19楼

                                                                          楼主 能发我一份反卷积程序吗 ?
                                                                          谢谢您了   急用 我的邮箱:1074290496@qq.com


                                                                              20楼

                                                                              楼主,也发份给我吧,谢谢
                                                                              lvweijun1988@126.com


                                                                                  21楼

                                                                                  给兄弟发份吧,谢谢。有没有更相信点的解释


                                                                                      22楼

                                                                                      给兄弟发一份吧,谢谢,有没有更详细点的解释


                                                                                          23楼

                                                                                          邮箱liulei1121ll@163.com,谢谢


                                                                                              • 共有23篇贴子
                                                                                              分享到: