C语言实现Sinc函数(或称抽样函数/傅里叶核函数)频谱及假频、吉布斯现象分析

#include<stdio.h>
#include<math.h>
#define dt 0.001   //时间采样间隔
#define NP 2001    //函数长度,样点数
#define df 0.5     //频率采样间隔
#define Hf 40      //最大频率
#define fc 20      //方波的高频
#define PI 3.1415926
int main(void)
{
    FILE *fp;
    float ft[NP];
    float t,Xr,Xi,Xamp;
    int i,k,Nf = Hf/df+1;
    fp = fopen("Sinc_AMP2.xls","w");
    for(i = -NP/2;i<=NP/2;i++)
    {
        t = i*dt;
        if(t==0)
            ft[i+NP/2]=1.0;
        else
        ft[i+NP/2] = sin(2*PI*fc*t)/(2*PI*fc*t);

        //fprintf(fp,"%10.4f\t%10.4f\n",i*dt,ft[i+NP/2]);

    }

    for(k=-Nf;k<=Nf;k++)
    {
        Xr = 0;
        Xi = 0;
        for(i = -NP/2;i<=NP/2;i++)
        {
            t = i*dt;
            Xr = Xr + ft[i+NP/2]*cos(2*PI*k*df*t);
            Xi = Xi + ft[i+NP/2]*sin(2*PI*k*df*t);
        }
        Xamp  = sqrt(Xr*Xr+Xi*Xi)*dt;
        fprintf(fp,"%10.4f\t%10.4f\n",k*df,Xamp);
    }
    fclose (fp);
    return 0;
}

抽样函数的频谱是一方波是人所共知的。

但观察上面的图片可以发现并不是一个完美的方波。

这就是因为吉布斯现象:

  1. 间断点处有一异常高值(左右均有),约为(0.0273-0.025)/0.025=0.092即发生了约为9%的高值溢出。

  1. 间断点内部的函数变化是震荡的。

  1. 当频率域间隔由0.5(分析精度不够高)减小到0.05时,在间断点的外侧(|w|>20Hz)可以观察到震荡趋于0【下图】。

下面是局部放大:可以很明显的观察到震荡现象(间断点两侧均有)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值