フーリエ合成
#include <GL/freeglut.h> #define _USE_MATH_DEFINES #define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 #define X_WIDTH 700 #define Y_HEIGHT 100 double ak(int k) { //Akをkのごとに与える if (k == 0) { //A_0の値 } else { return //A_k(k>=1)の値 } } double bk(int k) { //Bkをkの値ごとに与える return //B_k(k>=1)の値 } void Line2D(int x1, int y1, int x2, int y2, float size) { glLineWidth(size); glBegin(GL_LINES); glVertex2i(x1, y1); glVertex2i(x2, y2); glEnd(); } void display(void) { int source[X_WIDTH]; //原波形 int period = 100; //周期 int amplitude = 50; //振幅 int kmax = 3; //高調波の最高次数 double w, fi, d; int x0Position, y0position; int k, t; char input[255]; /* 復元波形の大きさを決める */ //原波形の周期を入力(50-200)period period = 100; //原波形の振幅入力(50-120)amplitude amplitude = 100; /* この値を変えることでどのように変化するか観察する */ //高調波の最高次数を入力(2-100)kmax kmax = 100; x0Position = 50; y0position = 200; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //X軸,Y軸描画 glColor4f(1.0f, 1.0f, 1.0f, 1.0f); Line2D(x0Position, y0position - amplitude, x0Position, y0position + amplitude, 1.0); Line2D(x0Position, y0position, x0Position + X_WIDTH, y0position, 1.0); glLineWidth(1); glBegin(GL_LINE_STRIP); glColor4f(0.0f, 1.0f, 0.0f, 1.0f); w = 2.0*M_PI / (double)period; fi = amplitude *ak(0); for (k = 1; k <= kmax; k++) { fi += amplitude*ak(k); } glVertex2d(x0Position, y0position - fi); for (t = 1; t < X_WIDTH; t++) { fi = amplitude*ak(0); for (k = 1; k <= kmax; k++) { d = w * (double)k*(double)t; fi += amplitude*(ak(k) * cos((double)d) + bk(k)*sin((double)d)); } glVertex2d(x0Position + t, y0position - fi); } glEnd(); glFlush(); } void Init() { glClearColor(0.0, 0.0, 0.0, 1.0); glOrtho(0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, -1, 1); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowPosition(100, 100); glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow("波形描画"); glutDisplayFunc(display); Init(); glutMainLoop(); return 0; }
実行例
ソースコード
課題
演習問題3.8の演習問題にて,次の課題をおこなうこと.
(1)図の波形のフーリエ級数展開式が与式のようになることを確認せよ.
(2)フーリエ級数展開のスペクトルを図示せよ.
(3)フーリエ級数の合成によって,元の波形が表わされることを観察せよ.
観察する際には,合成する項数を上げるほどに,元の波形に近づくことが分かるように,複数の項数による合成の結果を表示する.報告する際には,周期,周波数,項数の条件を付与すること.
提出レポートには,追記部分のソースコードの部分のみを含めること.
提出方法
締切日時:5月15日授業開始時
形式:紙面のレポートにて提出する.
章立てなどをする必要はない.問いに対する解答が十分に示されていればよい.