チーム15B6
課題名
スイッチで変化させるアベレージングフィルタ
研究者名
3-14-39 Tatsuya Fujishiro
3-14-40 Takafumi Funakoshi
説明
矩形波から始まり、スイッチが押されるごとにアベレージングフィルタを段々とかけていく。
実行結果
↓初期状態
↓1回スイッチを押した結果
↓再び1回スイッチを押した結果
↓何回もスイッチを押すとこの状態から変化しなくなる
プログラム
#include<stdio.h>
#include <math.h>
#include <device.h>
void main()
{
#define N 32
int wave[N] = {1,1,1,1,16,16,16,16,1,1,1,1,16,16,16,16,1,1,1,1,16,16,16,16,1,1,1,16,16,16,16}; int avewave[N]; int i,j,k; LCD_Char_1_Start(); LCD_Char_1_ClearDisplay(); for(;;) { if(!SW_Read()){ LCD_Char_1_ClearDisplay(); for(i=0;i<N;i++){ avewave[i]=wave[i]; } for(j=0;j<N;j++){ wave[j]=(avewave[j]+avewave[(j+1)%32]+avewave[(j+2)%32]+avewave[(j+3)%32])/4; } while(!SW_Read()){ for(k=0;k<N;k++){ LCD_Char_1_DrawVerticalBG(1,k,1,wave[k]); if(wave[k]>8){ LCD_Char_1_DrawVerticalBG(0,k,1,wave[k]-8); } } } }else for(k=0;k<N;k++){ LCD_Char_1_DrawVerticalBG(1,k,1,wave[k]); if(wave[k]>8){ LCD_Char_1_DrawVerticalBG(0,k,1,wave[k]-8); } } }
}
/* [] END OF FILE */
考察
アベレージングフィルタを段々とかけていくと最初は矩形波だった波が最後には水平になって変化がなくなった。
これは隣り合う値の平均をとっているため最終的にはどの要素も同じ値になる。
授業でExcelを用いてこのグラフを作った際は値の数が有限であったため、値が3個ずつ減っていたので初めはアベレージングフィルタをかける処理を次のように変数jの範囲をN-3に設定していた。
for(j=0;j<N-3;j++)
{
wave[j]=(avewave[j]+avewave[(j+1)%32]+avewave[(j+2)%32]+avewave[(j+3)%32])/4;
}
しかし、これで実行するとグラフは水平に収束せず、右肩上がりになってしまった。
フィルタをかける処理の時、配列の番地を%32をすることで配列の最後まで行くと最初に戻るようにしているので、値は無限に存在していると考えることができるから、-3を取り除いた結果、水平に収束させることができた。
また、今回はLCDに
LCD_Char_1_DrawVerticalBG(1,k,1,wave[k]);
if(wave[k]>8){
LCD_Char_1_DrawVerticalBG(0,k,1,wave[k]-8);
のようなプログラムで出力した。これはLCDの1列目2列目で場合分けして出力しているが、
LCD_Char_1_DrawVerticalBG(1,k,2,wave[k]);
とすることでも出力は可能となる。これは引数の3つ目の2という数字が2列分使うことを意味しているからである。
- 最終更新:2015-06-08 17:20:32