c++信号产生之-SIN波形
初衷
最近在军事杂志上看到有关于雷达方面的报道,有一些信号处理方面的术语不甚了解,特别是针对脉冲内部数据分析的解说更是云雾缭绕,在上学的时候,又没有学过数字信号处理相关的知识,想来可以查阅资料,自己从产生最简单的数字波形入手,也不至于太难,之前学过一些c++,听说matlab在数字信号处理方面是个很好的工具,现学一点用来验证数据正确性方可。音频是生活中最容易接触的信号波形,用代码生成的波形也可以通过音频分析进行验证,所以cooledit也是我需要的得力工具之一。
由于作者本人不甚专业,有些地方处理得不太妥帖是在所难免的,望您指正。
- 量程
数字信号的函数式自变量和因变量都是分散的。因变量通常用数量有限的整数表示。也就是说信号的幅度值通常被限定在一个确定的整数值上。在演示示例中我们将数据存储在一个字节或者两个字节的有符号类型变量中,存储值的最大最小值范围都是受到数据存储类型限制的。(char:-128~+127;short:-32768---32767)为了方便起见,将量程范围定义为两个宏,数据范围随选择的存储类型而在定义宏的正负值之间进行变化;
//short:-32767~32767
//char:-127~127
#define INT16_MAX ((short) 32767)
#define INT8_MAX ((char) 127)
enum SIMPLE_bite
{
_8_bits = 1,//采样数值按照1字节存储
_16_bits = 2,//采样数据按照两字节存储
};
- 公式与实现
上述公式代表采样的第n个点对应的sin数值。
:代表的是中心频率点;
:代表的是第n个点对应的时间值;
:该次采样的总的采样点个数;
:该次采样的持续时间;
:代表的采样次数索引。
基于上诉信息,我们便可迭代产生sin波形,代码如下:
void GeneratePositiveSignData(unsigned char* p, float amp, double sampleRate, double f0, double DT, SIMPLE_bite samplt_bite)
{
float ACCURACY = samplt_bite == _8_bits ? INT8_MAX : INT16_MAX; //量程精度
double W = 2.0 * MATH_PI * f0 / fs;
if(amp > 1.0){//上下幅度占整个量程的百分比
amp = 1.0;
} else if (amp <= 0.01){
amp = 0.01;
}
short* pValue = (short*)p;
int N = DT * fs;//总共的采样点数
for (int i = 0; i < N; ++i)
{
double v = amp * ACCURACY * sin(W * i * 1.0);
switch (samplt_bite)
{
case _8_bits:
{
p[i] = v < 0?floor(v):ceil(v);//如果小于零则向下取整,大于零则向上取整
}
break;
case _16_bits:
{
pValue[i] = v < 0?floor(v):ceil(v);
}
break;
default:
break;
}
}
}
- 验证
利用上诉代码输入如下参数(采样率是频率的两倍以上):
将生成的文件按照如下步骤导入coolEdit中:
FFT分析(和我们设置的频点可以对应得上)
频谱流水图:(持续保持在一个频点内)
下章预告:LFM数字波形的生成
上一篇: 手把手教系列之梳状滤波器设计实现
下一篇: 阅读react文档核心概念_笔记