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,//采样数据按照两字节存储
};
  • 公式与实现

                             \LARGE x\left ( n \right )= \sin\left ( 2 \cdot PI\cdot f0\cdot nT \right )

                                                                    \LARGE N=fs*DT

                                                                       \LARGE nT=i / fs

上述公式代表采样的第n个点对应的sin数值。

\LARGE f0:代表的是中心频率点;

\LARGE nT:代表的是第n个点对应的时间值;

\LARGE N:该次采样的总的采样点个数;

\LARGE DT:该次采样的持续时间;

\LARGE i:代表的采样次数索引。

基于上诉信息,我们便可迭代产生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数字波形的生成

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值