各位大侠帮个忙,C语言实现正弦波输出!谢谢了,着急用。

csdnyong 2008-03-25 11:23:08
50Hz的正弦波作为基波,和其他频率的正弦波叠加输出,公式如下:

y(k)=A*y(k-1)+B*y(k-2)+D*x(k)+C*x(k-1)
其中:A=2cos(wt) C=sin(wt) B不需要计算,是-1,
其中w=2*180*f(f为各个频率值) ,t=0.00001

已知的数值:x(0)=1,x(1)=0,x(2)=0,x(3)=0,就是除了x(0)=1,去他的x(n)=0;
y(n)在n<0时都是等于0
由以上条件可以得到:
y(0)=A*y(-1)+B*y(-2)+D*x(0)+C*x(-1)=D;
y(1)=A*y(0)+B*y(-1)+D*x(1)+C*x(0)=A*D+C
y(2)=A*(A*D+C)+B*D


得到
y(n)=A*y(n-1)+B*y(n-2) (n>2)

控制台输入f的值。输出叠加后的波形。谢谢了!
...全文
1910 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Skt32 2008-03-31
  • 打赏
  • 举报
回复
VC正弦例子2008年01月09日 星期三 15:16/*
是从原来,画椭圆中改的,但是这两个不能同时运行
*/
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define Pi 3.1415926

long WINAPI WndProcMe(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
BOOL InitWindowsClassMe(HINSTANCE hInstance);
BOOL InitWindowsMe(HINSTANCE hInstance,int nCmdShow);

double dfTheta=0,dfRange=100.0; //角度
long i=0,j=0;
long lCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange); //圆心 半径
POINT lpSin[100]; //正弦曲线的点坐标

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG Message;
if(!InitWindowsClassMe(hInstance))
return FALSE;
if(!InitWindowsMe(hInstance,nCmdShow))
return FALSE;
//比上个程序多出的部分
for(int j=0;j<100;j++) //生成正弦曲线点的坐标
{
lpSin[j].x=(long)(j*2*Pi/100*60);
lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100));
}
//比上个程序多出的部分
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProcMe(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
HDC hDC,hDC1;
HBRUSH hBrush,hBrush1;
HPEN hPen,hPen1;
PAINTSTRUCT PtStr,PtStr1;
switch(iMessage)
{
case WM_PAINT: //绘图消息
/* hDC1=BeginPaint(hWnd,&PtStr1); //设备指针
SetMapMode(hDC1,MM_ANISOTROPIC); //映像模式
hPen1=(HPEN)GetStockObject(BLACK_PEN); //画笔
hBrush1=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//画刷
SelectObject(hDC1,hPen1);
SelectObject(hDC1,hBrush1);//选择画刷
Ellipse(hDC1,250,150,300,250); //椭圆
EndPaint(hWnd,&PtStr1);//结束
*/ //比上个程序多出的部分
hDC=BeginPaint(hWnd,&PtStr);
SetWindowOrgEx(hDC,-200,-200,NULL); //原点坐标(-200,-200)
//DeleteObject(hPen); //删除画笔
//DeleteObject(hBrush);
hPen=CreatePen(PS_DASH,1,RGB(255,0,0));
SelectObject(hDC,hPen);
Polyline(hDC,lpSin,100); //绘制正弦曲线
if(i<=25)
{
hPen=CreatePen(PS_DASH,1,RGB(255,0,0));//创建新红画笔
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0)); //创建新红画刷
lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);
}
else if(i<50)
{
hPen=CreatePen(PS_DASH,1,RGB(0,255,0));//创建绿画笔
hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));
lRadious=(long)(dfRange*0.2+i%15*dfRange*0.4/25);//计算半径
}
else if(i<=75)
{
hPen=CreatePen(PS_DASH,1,RGB(0,0,255));
hBrush=CreateHatchBrush(HS_VERTICAL,RGB(0,0,255)); //创新蓝画刷
lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);
}
else
{
hPen=CreatePen(PS_DASH,1,RGB(255,255,0));
hBrush=CreateHatchBrush(HS_VERTICAL,RGB(255,255,0));
lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);
}
SelectObject(hDC,hBrush);
SelectObject(hDC,hPen);
lCentreX=lpSin[i].x;
lCentreY=lpSin[i].y;
Ellipse(hDC,lCentreX-lRadious,lCentreY-lRadious,
lCentreX+lRadious,lCentreY+lRadious);
i++;
DeleteObject(hPen);
DeleteObject(hBrush);
Ellipse(hDC,250,150,300,250); //椭圆
EndPaint(hWnd,&PtStr);
Sleep(100);
//比上个程序多出的部分
MessageBeep(2);
if(i<100)InvalidateRect(hWnd,NULL,1);//刷新用户区
//比上个程序多出的部分
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
BOOL InitWindowsClassMe(HINSTANCE hInstance)
{
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,"END");
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProcMe;
WndClass.lpszClassName="WinFill";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
return RegisterClass(&WndClass);
}
BOOL InitWindowsMe(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow("WinFill","会同程序",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
Mr-Chen 2008-03-29
  • 打赏
  • 举报
回复
主要是图形模式下绘图吧,使用graphics库
kkkgho 2008-03-29
  • 打赏
  • 举报
回复
D:\D\C++\asdsadsad\asdsadsad.cpp(32) : error C2374: 'i' : redefinition; multiple initialization
D:\D\C++\asdsadsad\asdsadsad.cpp(15) : see declaration of 'i'
D:\D\C++\asdsadsad\asdsadsad.cpp(36) : error C2374: 'i' : redefinition; multiple initialization
D:\D\C++\asdsadsad\asdsadsad.cpp(15) : see declaration of 'i'
D:\D\C++\asdsadsad\asdsadsad.cpp(43) : error C2374: 'i' : redefinition; multiple initialization
D:\D\C++\asdsadsad\asdsadsad.cpp(15) : see declaration of 'i'

熊猫的不行啊 - -
csdnyong 2008-03-26
  • 打赏
  • 举报
回复
那位给各写好的程序。呵呵。
Supper_Jerry 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 csdnyong 的回复:]
使用C 不是C++ 就是输出控制台用这个“*”输出波形就行,不要绘制图。


*
* *
* * *
* * *
* *
* *
* *
*
[/Quote]
使用公式,计算到叠加后的x,y位置。
在此位置printf 个*,就可以了。
不过自己需要规划屏幕大小,以及x,y相对于屏幕的位置。
csdnyong 2008-03-26
  • 打赏
  • 举报
回复
使用C 不是C++ 就是输出控制台用这个“*”输出波形就行,不要绘制图。


*
* *
* * *
* * *
* *
* *
* *
*
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
y(n)=A*y(n-1)+B*y(n-2) n>2;
A=2cos(wt) 其中w=2*180*f(f为各个频率值) ,t=0.00001 f=1/50=0.02 Hz
B = -1,

y(n)还是个递推公式吧,要用c实现的话,用Graphic库吧,不过注意将来像素显示都是int类型啊,
计算出来的y(n)却是浮点数,
Graphic库是TC下面的,
Supper_Jerry 2008-03-26
  • 打赏
  • 举报
回复
知道公式了。会画图就可以写这个程序了。
取离散点,计算叠加后的x,y,在屏幕上放个像素就可以了。
c++很容易,SetPixel(x,y)就可以 。c语言的话需要用到Graphic.h
jixingzhong 2008-03-26
  • 打赏
  • 举报
回复
参考程序 www.pudn.com/downloads49/sourcecode/windows/detail167118.html
野男孩 2008-03-26
  • 打赏
  • 举报
回复
画图没干过,帮顶!
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
//十分不精确啊,大概就是这样做,
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
//创建一个窗口大小的缓存区;
char cWindow[25][80]={0};
for(int i=0; i<25; i++)
for(int j=0; j<79; j++)
cWindow[i][j]=32;

float A, B, C, D;
A = 2*cos(2*180*0.02* 0.00001);
B = -1;
C = sin(2*180*0.02* 0.00001);
D = 0.5; //---------------??

int n=50; //可以更改n的值,cin>>n

float* pY=new float[n];
pY[0]=D;
pY[1]=A*D+C;
pY[2]=A*pY[1]+B*D;

for (int i=2; i<n; i++)
pY[i]=A*pY[i-1] + B*pY[i-2];

//左下角作为坐标中心;
for (int i=0; i<n; i++)
{
int iRow=(int) pY[i];
cWindow[24-iRow][i]='*';
}

//输出结果;
for(int i=0; i<25; i++)
puts(cWindow[i]);

delete pY;
return 0;
}
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
D的值是多少啊???
星羽 2008-03-26
  • 打赏
  • 举报
回复
波形 ??

要画图阿 - -b 控制台?

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧