フーリエ級数展開は信号解析や波形の分解に不可欠な手法です。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言語でのフーリエ級数展開は、係数計算と三角関数の和の計算が基本です。今回のサンプルコードを基に、データサイズや展開項数を調整することで、任意の周期信号に応用可能です。大学の課題や信号処理の学習に活用してください。


コメント