无规则波形发生函数

简介: 无规则波形发生函数

如题需要产生一个无规则,通用性的波形函数。

先讲最优解,方便复制就跑。不着急的兄弟可以看一下我的解题思路。

#define Type  int    //方便修改之后要变换的存储类型
Type arr[] = { 3, 1, 2, 1, 1 };  //电平翻转3次,起始电平为1,持续时间分别为2,1,1个时间周期
void Waveform(Type* arr)  //以51举例,直接操作对应引脚
{
  Type x,j;//x存放电平情况,j存放电平翻转次数
  j    = *(arr++);
  P1^1 = *(arr++);  //起始电平
  while (j--)
  {
    x = *(arr++);
    delay(x);
        P1^1=~P1^1;
  }
}
void main()
{
  Waveform(arr);
  while(1);
}

我看到此题的第一想法是创建一个数组,数组内存放单个周期的电平情况,就如此波形。数组如下

 

int arr[40]={1,1,0,1,0,0};//后面的就不写了


注:全文波形以前面这部分为例子

有了数组之后再创建一个函数,传入数组首元素地址,每隔一个单位时长根据数组内容翻转电平。

void Waveform(int* arr)  //以51举例,直接操作对应引脚
{
    int x;
    for(x=0;x<40;x++)
    {
        P1^1=*(arr+x);
        delay(1);
    }
}
void main()
{
    Waveform(arr);
    while();
}


但是这样就会遇到一个问题,假如波形持续时间超过40个单位时长了呢?于是我就想创建一个字符串,这样波形持续时间就可以变长变短了。    

char* arr="110100"
void Waveform(char* arr)  //以51举例,直接操作对应引脚
{
    while(*arr!='\0')
    {
        P1^1=*(arr++)-48;//因为*之后出来的是ASCII的值,字符'0'对应48
        delay(1);
    }
}
void main()
{
    Waveform(arr);
    while();
}


但是还是有问题,这个delay的延时只有一个单位周期,而且如果波形持续时间过长,这个字符串必然很长。我们是不是可以尝试改变,如果波形不变化就持续延时。这样,我就要知道一个概念,一个波形的产生需要的要素。第一个是起始电平,第二个是波形持续时间,只需要在这个持续的时间到了就翻转电平即可。


虽说如此,写程序的时候,你会发现如果我高电平要持续10个单位周期,低电平需要5个。这个怎么表示呢?这个也很好解决,利用ASCII码表。因为“空格”的ASCII值是32,而空格之前的值我们无法打印,于是我们以空格为起始值进行创建函数。


char* arr="1!  !";//首元素表示起始电平,之后的符号表示持续时间
void Waveform(char* arr)  //以51举例,直接操作对应引脚
{
    int x;
    P1^1=*(arr++)-48;
    while(*arr!='\0')
    {
        x=*(arr++)-31;//因为空格为32
        delay(x);
        P1^1=~P1^1;//注意:在整个函数结束的时候,引脚电平为结束电平的相反
    }
}
void main()
{
    Waveform(arr);
    while();
}


但是这样依然有问题,因为ASCII码表仅仅有127个字符,假如我的波形是1个单位周期的低电平,199个单位周期的高电平怎么办呢?于是,我想到了动态内存管理,这样有效的解决了如果高低电平单位周期持续时间过长,但是ASCII码表不足的问题。


可是在写程序的时候,我想到了一个问题,如何把数据简单直观的写入这串刚开辟的内存空间呢?

#define num   5   //表示波形变化次数,如果波形变化四次,num就是5,因为第一个要预留给起始电平
#define Type  int //为防止电平持续时间过长,一个字节存放不下,就用int。此处可改为char
void Waveform(Type* arr)  //以51举例,直接操作对应引脚
{
  int x,j=num;
  P1^1 = *(arr++);   //引脚为起始电平
  while (--j)
  {
    x = *(arr++);   //读取电平持续时间
    delay(x);
        P1^1=~P1^1;
  }
}
void main()
{
  int* ptr = NULL;
  ptr = (int*)malloc(num*sizeof(Type));
  if (NULL != ptr)    //判断ptr指针是否为空
  {
    int i = num;
    *ptr = 1;  //将起始电平写入
/***********
      将电平持续时间写入,这里是个麻烦事情
***********/
  }
  Waveform(ptr);
  free(ptr);//释放ptr所指向的动态内存
  ptr = NULL;
  while(1);
}

通过上面这串代码,我们发现将电平持续时间写入比较麻烦。而且,程序难度较大,在大规模的工程中,如果忘记释放申请的空间和没有把ptr置为空指针,会出现问题(具体问题百度)。


那么,有没有那种既简单,长度,数据类型可变换的方案呢?有!而且很简单,就是我们一开始讲的数组,在我们建立数组的时候,我们不要往里面一开始就规定数组大小。即 arr【】,里面不写入数据。


但是,写程序的时候,依然有问题。什么问题呢?就是我们的Waveform函数不知道数组的大小,应该什么时候截止。那么我们就可以在数组的首元素写好波形变换次数就行。现在,我们可以确认好数组的组成了,首元素是波形变换次数,第二个元素是波形起始电平。之后的就是波形持续时间。


#define Type  int    //方便修改之后要变换的存储类型
Type arr[] = { 3, 1, 2, 1, 1 };  //电平翻转3次,起始电平为1,持续时间分别为2,1,1个时间周期
void Waveform(Type* arr)  //以51举例,直接操作对应引脚
{
  Type x,j;//x存放电平情况,j存放电平翻转次数
  j    = *(arr++);
  P1^1 = *(arr++);  //起始电平
  while (j--)
  {
    x = *(arr++);
    delay(x);
        P1^1=~P1^1;
  }
}
void main()
{
  Waveform(arr);
  while(1);
}

以上函数已具备无规律性和通用性。我们只需要更改arr这个数组里面的值,即可创立一个可变的随机波形。


目录
相关文章
|
6月前
|
算法 异构计算
基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench
基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench
|
5天前
|
算法 物联网 异构计算
基于FPGA的4FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4FSK调制解调系统的Verilog实现,包括高斯信道模块和误码率统计模块,支持不同SNR设置。系统在Vivado 2019.2上开发,展示了在不同SNR条件下的仿真结果。4FSK调制通过将输入数据转换为四个不同频率的信号来提高频带利用率和抗干扰能力,适用于无线通信和数据传输领域。文中还提供了核心Verilog代码,详细描述了调制、加噪声、解调及误码率计算的过程。
31 11
|
2月前
|
算法 测试技术 开发工具
基于FPGA的QPSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
该系统在原有的QPSK调制解调基础上,新增了高斯信道和误码率统计模块,验证了不同SNR条件下的QPSK误码性能。系统包括数据生成、QPSK调制与解调等模块,使用Vivado 2019.2进行仿真,展示了SNR分别为15dB、10dB、5dB和1dB时的误码情况。系统采用Verilog语言实现,具有高效、可靠的特点。
51 3
|
3月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本系统基于FSK调制解调,通过Vivado 2019.2仿真验证了不同信噪比(SNR)下的误码率表现。加入高斯信道与误码统计模块后,仿真结果显示:SNR=16dB时误码极少;随SNR下降至0dB,误码逐渐增多。FSK利用频率变化传输信息,因其易于实现且抗干扰性强,在中低速通信中有广泛应用。2FSK信号由连续谱与离散谱构成,相位连续与否影响功率谱密度衰减特性。Verilog代码实现了FSK调制、加性高斯白噪声信道及解调功能,并计算误码数量。
64 5
|
6月前
|
C语言
输出4种波形的函数信号发生器
设计了一款基于MCS-51单片机的函数信号发生器,能生成四种波形(正弦、方、三角、锯齿),频率范围10-100Hz,步进值0.1-10Hz。系统包括5V电源、AT89C51单片机、DAC0832、LM358、LCD1602、键盘和LED电路。通过按键切换波形、设定频率和步进值,LCD实时显示信息,LED指示波形类型。Proteus和Altium仿真验证了设计功能。
122 10
|
6月前
|
存储 算法 异构计算
m基于FPGA的多功能信号发生器verilog实现,包含testbench,可以调整波形类型,幅度,频率,初始相位等
使用Vivado 2019.2仿真的DDS信号发生器展示了正弦、方波、锯齿波和三角波的输出,并能调整幅度和频率。DDS技术基于高速累加器、查找表和DAC,通过频率控制字和初始相位调整产生各种波形。Verilog程序提供了一个TEST模块,包含时钟、复位、信号选择、幅度和频率控制输入,以生成不同波形。
183 18
|
算法 异构计算
m基于FPGA的带相位偏差QPSK调制信号相位估计和补偿算法verilog实现,包含testbench
m基于FPGA的带相位偏差QPSK调制信号相位估计和补偿算法verilog实现,包含testbench
358 0
|
数据采集 编解码 网络性能优化
ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
748 0
ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
|
算法 异构计算
m基于FFT傅里叶变换的256QAM基带信号频偏估计和补偿FPGA实现,含testbench和matlab星座图显示
m基于FFT傅里叶变换的256QAM基带信号频偏估计和补偿FPGA实现,含testbench和matlab星座图显示
295 0
|
算法 异构计算
基于FFT傅里叶变换的64QAM基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab星座图显示
基于FFT傅里叶变换的64QAM基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab星座图显示
368 0