C语言分析假频现象(频谱折叠)

这里是用振幅谱代替频谱,前者振幅/后者=1/2*Π。

#include "stdio.h"
#include "math.h"
#include "malloc.h"
#include "stdlib.h"
#define PI 3.1415926
#define f_1 10//T_1 = 1/10
#define f_2 35//T_2 = 1/35
#define f_3 70//T_3 = 1/70
#define fk 1    
#define M 1025   
#define dt 0.01
#define N 100
int main (void)
{
    int i,n;
    FILE *fp1,*fp2;
    float an,bn,cn,t;
    float function[1025];
    fp1 = fopen("function_Cn(A).xls","w");
    fp2 = fopen("function.xls","w");
    //先写原信号至fp2
    for(i=-M/2;i<=M/2;i++)
    {
        t=i*dt;
        function[i+M/2] = sin(2*PI*f_1*t)+sin(2*PI*f_2*t)+sin(2*PI*f_3*t);
        fprintf(fp2,"%f\t%f\n",t,function[i+M/2]);
    }
    //再写振幅谱至fp1
    for(n=-2*N;n<=2*N;n++)
    {
        an=0;//必不可少,否则结果cn是一恒定常数
        bn=0;
        for(i=-M/2;i<=M/2;i++)
        {
            t=i*dt;
            function[i+M/2] = sin(2*PI*f_1*t)+sin(2*PI*f_2*t)+sin(2*PI*f_3*t);
            an = an + function[i+M/2]*cos(2.0*PI*n*fk*t);
            bn = bn + function[i+M/2]*sin(2.0*PI*n*fk*t);
        }
        cn = sqrt(an*an+bn*bn)*dt;
        fprintf(fp1,"%d\t%10.4f\n",n*fk,cn);//算一个写一个
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
}

折叠频率为采样频率的一半。

频谱以100为周期循环,100以内由于50Hz作为折叠频率发生了频谱折叠,导致有三个假频。

令人醒目的假频现象。

第三张图片是dt = 0.001时,满足采样定理。

显示出的三个主频正是函数具有的,无假频出现。

采样定理

当时间域信号f(t)的频带有限时,即|W|<Wm,时F(W)为有限值,其他区域为0。那么只有当采样间隔足够小时:Ts<1/2*fm,原信号f(t)才可唯一地被样值信号fs(t)恢复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值