用函数的办法产生各种波形,求助。

2019-07-16 03:07发布

函数要实现的功能是:传入四个参数‘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++;
        }       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。