波形合成之C语言实现
正弦波波形合成
void sinwave(int* dout,int genlen,int freq,int fs,float tzsd,uint32_t addr)
{int C ;float s_amp=tzsd/(tzsd+1.0);float c_amp=1.0/(tzsd+1.0);C=32767*0.9;int sintab [65536];float freq_guiyihua = ((float)freq)/((float)fs);int zhouqihua = (int)(freq_guiyihua*65536);int i;for (i = 0; i < genlen; i++) {sintab[i]=(int)(sin((PI*2*i*(zhouqihua/65536.0)))*pow(2,15))*0.8;dout[i] = sintab[i]* s_amp + C*c_amp;*(volatile u32 *)(XPAR_BRAM_0_BASEADDR+(addr*4)) = dout[i];}
}
生成的数据
方波合成
//方波合成函数
void squareWare(int* dout,int genlen,int freq,int fs,float tzsd,uint32_t addr)
{int C ;float s_amp=tzsd/(tzsd+1.0);float c_amp=1.0/(tzsd+1.0);C=32767*0.9;int sintab [65536];float freq_guiyihua = ((float)freq)/((float)fs);int zhouqihua = (int)(freq_guiyihua*65536);printf("\r\n");printf("%d",zhouqihua);printf("\r\n");int i;for ( i = 0; i < genlen; i++){sintab[i]= i*(zhouqihua/65536.0);if(sin((PI*2*i*(zhouqihua/65536.0))) >=0){sintab[i]=(int)(pow(2,15))*0.8;}else{sintab[i]=-(int)(pow(2,15))*0.8;}dout[i] = sintab[i]* s_amp + C*c_amp;*(volatile u32 *)(XPAR_BRAM_0_BASEADDR+(addr*4)) = dout[i];}
}
生成波形
三角波合成
//三角波合成函数
void triangularWave(int* dout,int genlen,int freq,int fs,float tzsd,uint32_t addr)
{int C ;float s_amp=tzsd/(tzsd+1.0);float c_amp=1.0/(tzsd+1.0);C=32767*0.9;int sintab [65536];double temp = 0; //表示弧度double radian = 0; //取余之后的弧度值float freq_guiyihua = ((float)freq)/((float)fs);int zhouqihua = (int)(freq_guiyihua*65536);int i;for ( i = 0; i < genlen; i++) {temp = (PI*2*i*(zhouqihua/65536.0));radian = fmod(temp, 2.0*PI);if(radian > 0) //当角度取余在 0~2pi之间时{if(radian<=PI/2){sintab[i]=(int)(pow(2,15))*0.8*(radian/(PI/2)); }else if(radian > PI/2 && radian <= PI*3/2) {sintab[i]=(int)(((double)(-2/PI)*radian+2)*pow(2,15)*0.8);}else if(radian <= PI*2){sintab[i]=(int)(((double)(2/PI*radian-4)*pow(2,15))*0.8);}}else if(radian == 0) //当角度为PI的整数倍时{sintab[i] = 0;}dout[i] = sintab[i]* s_amp + C*c_amp*0;*(volatile u32 *)(XPAR_BRAM_0_BASEADDR+(addr*4)) = dout[i];//寰€ 1204鍦板潃鍙戦€?}
}
生产波形
锯齿波生产
//锯齿波合成函数
void sawtoothWave(int* dout,int genlen,int freq,int fs,float tzsd,uint32_t addr)
{int C ;float s_amp=tzsd/(tzsd+1.0);float c_amp=1.0/(tzsd+1.0);C=32767*0.9;int sintab [65536];double temp = 0; //表示弧度double radian = 0; //取余之后的弧度值float freq_guiyihua = ((float)freq)/((float)fs);int zhouqihua = (int)(freq_guiyihua*65536);int i;for ( i = 0; i < genlen; i++) {temp = (PI*2*i*(zhouqihua/65536.0));radian = fmod(temp, 2.0*PI);if(radian >= 0) //当角度取余在 0~2pi之间时{sintab[i]=(int)(((double)(1/PI)*radian-1)*pow(2,15)*0.8);}dout[i] = sintab[i]* s_amp + C*c_amp;*(volatile u32 *)(XPAR_BRAM_0_BASEADDR+(addr*4)) = dout[i];//寰€ 1204鍦板潃鍙戦€?}
}
噪声合成
void noiseWave(int* dout, int genlen, int freq, int fs, float tzsd, uint32_t addr)
{int C ;float s_amp=tzsd/(tzsd+1.0);float c_amp=1.0/(tzsd+1.0);C=32767*0.9;int sintab [65536];double temp = 0; //表示弧度double radian = 0; //取余之后的弧度值float freq_guiyihua = ((float)freq)/((float)fs);int zhouqihua = (int)(freq_guiyihua*65536);int i;for ( i = 0; i < genlen; i++) {// 生成随机数 [0, RAND_MAX] → 转换为 [-1.0, 1.0]float rand_val = (rand() / (float)RAND_MAX) * 2.0f - 1.0f;// 应用幅度控制(tzsd 直接控制噪声强度)float noise = rand_val * tzsd;// 转换为整数样本(匹配 int 类型输出)float noise_sample = noise*pow(2,15)*0.8;// 写入输出数组dout[i] = noise_sample* s_amp + C*c_amp;printf("%.2f\r\n",noise_sample);// 写入BRAM(地址按顺序递增)*(volatile u32 *)(XPAR_BRAM_0_BASEADDR+(addr*4)) = dout[i];}
}
生成波形