フーリエ合成

#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日授業開始時
形式:紙面のレポートにて提出する.
章立てなどをする必要はない.問いに対する解答が十分に示されていればよい.