#include"math.h" #define IIRNUMBER 2 #define SIGNAL1F 1000 #define SIGNAL2F 4500 #define SAMPLEF 10000 #define PI 3.1415926 float InputWave(); float IIR(); float fBn[IIRNUMBER]={ 0.0,0.7757 }; float fAn[IIRNUMBER]={ 0.1122,0.1122 }; float fXn[IIRNUMBER]={ 0.0 }; float fYn[IIRNUMBER]={ 0.0 }; float fInput,fOutput; float fSignal1,fSignal2; float fStepSignal1,fStepSignal2; float f2PI; int i; float fIn[256],fOut[256]; int nIn,nOut; main() { nIn=0; nOut=0; f2PI=2*PI; fSignal1=0.0; fSignal2=PI*0.1; // fStepSignal1=2*PI/30; // fStepSignal2=2*PI*1.4; fStepSignal1=2*PI/50; fStepSignal2=2*PI/2.5; while ( 1 ) { fInput=InputWave(); fIn[nIn]=fInput; nIn++; nIn%=256; fOutput=IIR(); fOut[nOut]=fOutput; nOut++; /* 请在此句上设置软件断点 */ if ( nOut>=256 ) { nOut=0; } } } float InputWave() { for ( i=IIRNUMBER-1;i>0;i-- ) { fXn[i]=fXn[i-1]; fYn[i]=fYn[i-1]; } fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0; fYn[0]=0.0; fSignal1+=fStepSignal1; if ( fSignal1>=f2PI ) fSignal1-=f2PI; fSignal2+=fStepSignal2; if ( fSignal2>=f2PI ) fSignal2-=f2PI; return(fXn[0]); } float IIR() { float fSum; fSum=0.0; for ( i=0;i<IIRNUMBER;i++ ) { fSum+=(fXn[i]*fAn[i]); fSum+=(fYn[i]*fBn[i]); } return(fSum); }逐行注释
时间: 2023-10-15 18:06:52 浏览: 129
#define宏定义——只替换,不计算! #define VS typedef
这段代码是一个基于IIR滤波器的信号处理程序。下面是逐行注释:
```c
#include "math.h" // 引入math库,用于计算正弦和余弦函数
#define IIRNUMBER 2 // IIR滤波器的阶数
#define SIGNAL1F 1000 // 信号1的频率
#define SIGNAL2F 4500 // 信号2的频率
#define SAMPLEF 10000 // 采样频率
#define PI 3.1415926 // 圆周率
```
定义了一些常量,包括IIR滤波器的阶数、两个信号的频率、采样频率和圆周率。
```c
float InputWave(); // 声明输入信号函数
float IIR(); // 声明IIR滤波器函数
float fBn[IIRNUMBER]={ 0.0,0.7757 }; // 定义IIR滤波器的b系数
float fAn[IIRNUMBER]={ 0.1122,0.1122 }; // 定义IIR滤波器的a系数
float fXn[IIRNUMBER]={ 0.0 }; // 定义IIR滤波器的输入序列
float fYn[IIRNUMBER]={ 0.0 }; // 定义IIR滤波器的输出序列
float fInput,fOutput; // 定义输入信号和输出信号
float fSignal1,fSignal2; // 定义两个信号的相位
float fStepSignal1,fStepSignal2; // 定义两个信号的相位步进值
float f2PI; // 定义2π
int i; // 定义计数器
float fIn[256],fOut[256]; // 定义输入和输出信号的缓冲区
int nIn,nOut; // 定义输入和输出信号的缓冲区指针
```
定义了一些变量,包括IIR滤波器的系数、输入输出序列、输入输出信号的缓冲区以及缓冲区指针。
```c
main() {
nIn=0; nOut=0; // 初始化缓冲区指针
f2PI=2*PI; // 计算2π
fSignal1=0.0; // 初始化信号1的相位
fSignal2=PI*0.1; // 初始化信号2的相位
fStepSignal1=2*PI/50; // 设置信号1的相位步进值
fStepSignal2=2*PI/2.5; // 设置信号2的相位步进值
while ( 1 ) // 进入无限循环
{
fInput=InputWave(); // 获取输入信号
fIn[nIn]=fInput; // 存储输入信号到缓冲区
nIn++; nIn%=256; // 更新缓冲区指针
fOutput=IIR(); // 使用IIR滤波器处理输入信号
fOut[nOut]=fOutput; // 存储输出信号到缓冲区
nOut++; // 更新缓冲区指针
if ( nOut>=256 ) // 如果缓冲区已满
{
nOut=0; // 重置缓冲区指针
}
}
}
```
主函数,首先初始化了一些变量,然后进入无限循环,不断获取输入信号,使用IIR滤波器处理输入信号,并将输出信号存储到缓冲区中。当缓冲区已满时,重置缓冲区指针。
```c
float InputWave() {
for ( i=IIRNUMBER-1;i>0;i-- )
{
fXn[i]=fXn[i-1]; // 将输入序列往后移一位
fYn[i]=fYn[i-1]; // 将输出序列往后移一位
}
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0; // 生成输入信号
fYn[0]=0.0; // 初始化输出信号
fSignal1+=fStepSignal1; // 更新信号1的相位
if ( fSignal1>=f2PI ) fSignal1-=f2PI; // 保持相位在0~2π之间
fSignal2+=fStepSignal2; // 更新信号2的相位
if ( fSignal2>=f2PI ) fSignal2-=f2PI; // 保持相位在0~2π之间
return(fXn[0]); // 返回输入信号
}
```
输入信号函数,根据信号1和信号2的相位生成输入信号,并将输入信号存储到输入序列中。
```c
float IIR() {
float fSum;
fSum=0.0; // 初始化求和变量
for ( i=0;i<IIRNUMBER;i++ )
{
fSum+=(fXn[i]*fAn[i]); // 累加输入项的加权和
fSum+=(fYn[i]*fBn[i]); // 累加输出项的加权和
}
return(fSum); // 返回IIR滤波器的输出
}
```
IIR滤波器函数,根据输入和输出序列以及IIR滤波器的系数计算输出信号。具体而言,对于每个采样点,计算输入序列的加权和和输出序列的加权和,然后将它们相加得到输出信号。最后返回输出信号。
阅读全文