デジタル信号処理の重要な概念であるデジタルフィルタ。今回は、C言語を使用してデジタルフィルタの基本的な理念とサンプルコードを紹介します。コードの実行と結果を通して、デジタルフィルタがどのように信号を変換するかを理解しましょう。
リンク
1. デジタルフィルタの基本理念
デジタルフィルタは、離散時間信号に対して畳み込み演算を行い、信号を変換します。主なタイプには、低域通過フィルタ(Low Pass Filter)、高域通過フィルタ(High Pass Filter)、帯域通過フィルタ(Band Pass Filter)などがあります。
2. ローパスフィルタの例
ローパスフィルタは、特定の周波数以下の信号成分を通し、それ以外の成分をカットするフィルタです。以下に、C言語でのローパスフィルタのサンプルコードを示します。
#include <stdio.h>
#define N 10 // フィルタサイズ
#define N 10 // フィルタサイズ
void lowPassFilter(int signal, int output) {
for (int i = N; i < sizeof(signal) / sizeof(signal[0]); i++) {
output[i] = 0;
for (int j = 0; j < N; j++) {
output[i] += signal[i - j] / N; // Nで割ることで平均を取る
}
}
}
for (int i = N; i < sizeof(signal) / sizeof(signal[0]); i++) {
output[i] = 0;
for (int j = 0; j < N; j++) {
output[i] += signal[i - j] / N; // Nで割ることで平均を取る
}
}
}
int main() {
int inputSignal[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // 入力信号
int outputSignal[sizeof(inputSignal) / sizeof(inputSignal[0])]; // 出力信号
lowPassFilter(inputSignal, outputSignal);
printf("入力信号: ");
for (int i = 0; i < sizeof(inputSignal) / sizeof(inputSignal[0]); i++) {
printf("%d ", inputSignal[i]);
}
printf("\n出力信号: ");
for (int i = 0; i < sizeof(outputSignal) / sizeof(outputSignal[0]); i++) {
printf("%d ", outputSignal[i]);
}
return 0;
}
int inputSignal[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // 入力信号
int outputSignal[sizeof(inputSignal) / sizeof(inputSignal[0])]; // 出力信号
lowPassFilter(inputSignal, outputSignal);
printf("入力信号: ");
for (int i = 0; i < sizeof(inputSignal) / sizeof(inputSignal[0]); i++) {
printf("%d ", inputSignal[i]);
}
printf("\n出力信号: ");
for (int i = 0; i < sizeof(outputSignal) / sizeof(outputSignal[0]); i++) {
printf("%d ", outputSignal[i]);
}
return 0;
}
このサンプルでは、ローパスフィルタを適用して入力信号からノイズを削除し、平滑化した出力信号を得ることができます。
3. 実行結果と考察
実行すると、入力信号とローパスフィルタを適用した結果が表示されます。フィルタサイズ(N)を変更することで、フィルタの効果や出力信号がどのように変わるか試してみましょう。デジタルフィルタの理解がより深まることで、信号処理における応用が広がります。
リンク