函数要实现的功能是:传入四个参数‘A’,‘f’,‘fi’,‘offset’分别控制产生的波形的“幅值”,“频率”,“相位(左右平移)”,“上下平移”。通过计算,产生出特定个(比如:512个)采样点。存入数组(比如sineTable[512])中。
例如:
正弦波公式:A*sin(wt+fi)+offset
产生正弦波的函数:
void wave_sin(int A,int f,int fi,int offset)
{
int t;
for(t=0;t<SIN_BUFFER_SIZE;t++)
{
sineTable[t]=A*sin(2*3.14*f/SIN_BUFFER_SIZE*t+fi)+offset;
}
}
锯齿波和三角波的函数有一些问题,希望能给出它们的函数,或者在原基础上更正。不胜感激。
#include <stdio.h>
#include <math.h>
#define SIN_BUFFER_SIZE 512
int sineTable[SIN_BUFFER_SIZE];
int show[SIN_BUFFER_SIZE];
int temp[SIN_BUFFER_SIZE];
int jcb[SIN_BUFFER_SIZE];
int sjb[SIN_BUFFER_SIZE];
extern void wave_sin(int,int,int,int);
extern void wave_jcb(int,int,int,int);
extern void wshow(int);
void wshow(int wave) //最后要用于显示的数组,通过wave变量的值来选择
{
int s;
switch(wave)
{
case 0:for(s=0;s<=SIN_BUFFER_SIZE;s++)
{
show[s]=sineTable[s];
}break;
case 1:for(s=0;s<=SIN_BUFFER_SIZE;s++)
{
show[s]=temp[s];
}break;
case 2:for(s=0;s<=SIN_BUFFER_SIZE;s++)
{
show[s]=jcb[s];
}break;
case 3:for(s=0;s<=SIN_BUFFER_SIZE;s++)
{
show[s]=sjb[s];
}break;
}
}
void wave_sin(int A,int f,int fi,int offset) //产生正弦波的以及方波的函数
{
int t;
for(t=0;t<SIN_BUFFER_SIZE;t++)
{
sineTable[t]=A*sin(2*3.14*f/SIN_BUFFER_SIZE*t+fi)+offset;
if(sineTable[t]-offset>0) //利用已经产生出的正弦波,通过判断,转化为方波
{
temp[t]=offset+A;
}
if(sineTable[t]-offset<0)
{
temp[t]=offset-A;
}
if(sineTable[t]-offset==0)
{
temp[t]=offset;
}
}
}
void wave_jcb(int A,int K,int fi,int offset) //产生锯齿波的函数其中的K与之前的f作用一样,有一点的问题,左右平移实现得不好。
{
int p,B,j,i,t;
p=SIN_BUFFER_SIZE/K;
B=A/p;
j=0;
while(j<K)
{
t=j*p;
for(i=0;t<=(j+1)*p;t++,i++)
{
jcb[t+fi]=B*i+offset;
}
j++;
}
}
void wave_sjb(int A,int K,int fi,int offset) //产生三角波的函数 问题就在这里,当上下平移的时候波形会失真。左右平移会错误的显示锯齿波。
{
int p,B,j,i,t,jia;
p=SIN_BUFFER_SIZE/K;
jia=p/2;
B=A/p;
j=0;
while(j<K)
{
t=j*p;
for(;t<=j*p+jia;t++)
{
sjb[t+fi]=B*(t-j*p)+offset;
}
for(i=0;t<=(j+1)*p+jia;t++,i++)
{
sjb[t+fi]=sjb[jia-i]+offset;
}
j++;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>