c语言雷克子波,vans.c · skateboi/雷克子波与一维数组卷积的图像 - Gitee.com

该程序实现了雷克子波函数,用于生成子波信号,并进行了离散卷积操作。首先定义了子波的长度、采样间隔和中心频率,然后通过调用雷克函数生成子波数据。接着进行数据重组,并利用一维离散卷积公式计算卷积结果。最后,将处理后的数据写入文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# include

# include

# include

# include

# define PI 3.14

/* 函数定义区 */

void f(float *r, int Fm, int L, float dt);

float * h_Ip(float *pRaa1, int leng_1, float *pRaa2, int leng_2);

void main()

{

float R[71]; //用是存放生成的数据

float E[71];

int i, j;//用来循环的量

int L = 71; //子波长度

float dt = 0.001;//采样间隔

int Fm = 25;//子波的中心频率

FILE * fp; //定义一个文件类指针

float thrash[256] = {0};

float *pRaa = NULL;

f(R, Fm, L, dt); //调用雷克函数

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

for(i=35,j=0; i<=70,j<=35; i++,j++) // 12 3 45 , 01 2 34

{

E[i] = R[j];

}

for(i=0,j=35; i<=35,j>=0; i++,j--)

{

E[i] = R[j];

}

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

//thrash[242] = 1.0; // 128, 31, 242

//thrash[31] = 1.0;

//thrash[128] = 1.0;

pRaa = h_Ip(thrash, 256, E, 71);

/* 打开文件并判断 */

if((fp=fopen("Palace","w")) == NULL)

{

perror("data");

exit(1);

}

/* 向文件输出 */

for(i=0; i<71; i++) //326

{

fprintf(fp, "%f\n", E[i]);

}

fclose(fp); //关闭文件

free(pRaa);

}

void f(float *r, int Fm, int L, float dt) //雷克子函数

{

int *I; //I是时间间隔点

float *t;

int i;

/* 动态分配内存 */

t = (float *)malloc(sizeof(float) * L);

I = (int *)malloc(sizeof(int) * L);

/* 为时间间隔点赋值 从0~70 */

for(i=0; i

{

I[i] = i;

}

/* 通过t = i * dt的公式计算 */

for(i=0; i

{

t[i] = dt * I[i];

}

/* 通过计算r(t)的公式计算 并将值保存在R[]中 */

for(i=0; i

{

r[i] = (exp(-1*pow(PI*Fm*t[i], 2))) * (1 - 2*pow(PI*Fm*t[i], 2));

}

/* 释放内存 */

free(t);

free(I);

}

/* 一维离散卷积公式 */

/* 用于计算(pRaa1[leng_1] * pRaa2[leng_2])[leng_3] */

float * h_Ip(float *pRaa1, int leng_1, float *pRaa2, int leng_2) //leng_1是1数组的长度,leng_2是2数组的长度,*pRaa3用来储存卷积后的数据

{

float *pRaa3;

int n, m;

int leng_3; //leng_3是存放卷积完的长度

float k=0; //k用来临时存放数据

pRaa3 = (float *)malloc(sizeof(float)*(leng_1+leng_2-1));//动态分配内存,!没有销毁

leng_3 = leng_1+leng_2-1;

/* 通过离散卷积公式计算 */

for(n=0; n

{

for(m=0; m

{

if((n-m)>=0 && (n-m)

{

k += pRaa1[m] * pRaa2[n-m];

}

}

pRaa3[n] = k;

k = 0;

}

return pRaa3;

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值