|
我最近在做高频功率放大器的实验,在理解实验原理的时候,想计算出尖顶余弦脉冲的个次谐波分量的幅度。一开始我想通过手算,发现计算傅里叶变换比较困难,然后想到用matlab算,上网查查发现matlab语句理解着也挺麻烦,于是我就想既然matlab能计算,为什么我不能通过编程计算呢?然后我想到可以用微元法来计算积分,更加感觉可以通过编程解救这个问题。我把尖顶余弦脉冲信号的周期分成1000个时间段,根据周期信号的傅里叶变换公式计算出每个时间段的值,累加后就可以得出某次谐波分量的系数,多次计算就可以得出各次谐波分量的振幅。下面是用来计算的vc程序
#define PI 3.1415926
#include <stdio.h>
#include <math.h>
void main(void)
{
float d, ft[1000]; //一个周期划分为1000个小时间段
float dt_div_T; //dt/T
float w_mul_t[1000]; //w*t
int i, j, n;
float v_start; //
float Fn[100]; //计算到99次谐波
printf("输入尖顶余弦脉冲开始的弧度,假如尖顶余弦脉冲的弧度范围是正负Π/4,\r\n就输入0.25,请输入: ");
scanf("%f", &d);
printf("输入的弧度是 %fΠ\r\n", d);
// T/1000 = dt, dt/T = 1/1000
dt_div_T = 1.0/1000;
for(i=0; i<1000; i++)
{
w_mul_t[i] = (0 - d + (i*2.0/1000)) * PI;
}
for(i=0; i<1000; i++)
{
ft[i] = 0;
}
for(i=0; i<100; i++)
{
Fn[i] = 0;
}
v_start = sin(d * PI);
printf("尖顶余弦脉冲的峰值是 %f\r\n", 1 - v_start);
for(i=0; i<1000; i++)
{
ft[i] = sin((d + (i*2.0/1000)) * PI) - v_start;
if(ft[i] < 0)
ft[i] = 0;
}
for(n=0; n<100; n++)
{
for(j=0; j<1000; j++)
{
Fn[n] += ft[j] * cos(0 - n*w_mul_t[j]) * dt_div_T;
}
}
printf("基波分量的振幅\t%f\r\n", Fn[0]);
for(n=1; n<100; n++)
{
printf("%d次谐波分量的振幅\t%f\r\n", n, Fn[n]>0 ? Fn[n] : (0-Fn[n]));
}
getch();
} |
|