C言語でのフーリエ級数展開の実装方法とサンプルコード解説

C言語関連

フーリエ級数展開は信号解析や波形の分解に不可欠な手法です。C言語でフーリエ級数を実装する際の基本的な考え方と、簡単なサンプルコードの例を紹介します。本記事では、初心者でも理解できるように具体例を交えて解説します。

フーリエ級数展開の基本概念

フーリエ級数展開とは、周期関数を三角関数(正弦・余弦)の無限和で表す方法です。信号を各周波数成分に分解することで、解析や加工が容易になります。

C言語で実装する場合、離散的なデータに対して有限項の級数で近似するのが一般的です。

C言語でのフーリエ級数実装手順

1. 入力信号のデータ配列を用意する。

2. 展開項数 N を決め、各係数 a_n, b_n を計算する。

3. 計算した係数を用いて元信号を近似する。

具体的なサンプルコード例

以下は単純なフーリエ級数展開をC言語で行う例です。正弦波成分の係数を計算して信号を近似します。

#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
#define N 100  // データ数
#define M 10   // 展開項数

int main() {
    double x[N];
    double a0 = 0;
    double a[M], b[M];
    int n, k;

    // サンプル信号: f(t) = sin(2*PI*t/N)
    for(n = 0; n < N; n++) {
        x[n] = sin(2*PI*n/N);
    }

    // a0の計算
    for(n = 0; n < N; n++) {
        a0 += x[n];
    }
    a0 = a0 / N;

    // a_n, b_nの計算
    for(k = 1; k <= M; k++) {
        a[k-1] = 0;
        b[k-1] = 0;
        for(n = 0; n < N; n++) {
            a[k-1] += x[n] * cos(2*PI*k*n/N);
            b[k-1] += x[n] * sin(2*PI*k*n/N);
        }
        a[k-1] = a[k-1] * 2 / N;
        b[k-1] = b[k-1] * 2 / N;
    }

    // 結果表示
    printf("a0 = %f\n", a0);
    for(k = 0; k < M; k++) {
        printf("a[%d] = %f, b[%d] = %f\n", k, a[k], k, b[k]);
    }

    return 0;
}

コードのポイントと実例

このコードでは、N個のサンプル信号に対してM項までのフーリエ係数を計算しています。係数 a0, a_n, b_n を使って信号の近似や波形再構成が可能です。

例えば、元信号が正弦波の場合、最初の数項だけでほぼ完全に再現できます。

まとめ

C言語でのフーリエ級数展開は、係数計算と三角関数の和の計算が基本です。今回のサンプルコードを基に、データサイズや展開項数を調整することで、任意の周期信号に応用可能です。大学の課題や信号処理の学習に活用してください。

コメント

タイトルとURLをコピーしました