这里是用振幅谱代替频谱,前者振幅/后者=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)恢复。