program enshu06gs ! 移動平均によるバンドパスフィルターの線形性を確認するプログラム implicit none integer :: seireki,tsuki,joutai,bangou,kosuu real,dimension(1800) :: kion1retsu,kion1retsu_lowpass1,& kion1retsu_highpass1,kion1retsu_bandpass1a,kion1retsu_bandpass1b kosuu = 0 do read(*,'(2i5,i2.2,f6.1)',iostat=joutai)bangou,seireki,tsuki, & kion1retsu(bangou) if (joutai /= 0) exit kosuu = kosuu + 1 end do ! バンドパスフィルターその1: high -> low call my_highpass_filter(kion1retsu ,kion1retsu_highpass1 ,kosuu) call my_lowpass_filter(kion1retsu_highpass1,kion1retsu_bandpass1a,kosuu) ! バンドパスフィルターその2: low -> high call my_lowpass_filter(kion1retsu ,kion1retsu_lowpass1 ,kosuu) call my_highpass_filter(kion1retsu_lowpass1,kion1retsu_bandpass1b,kosuu) ! 結果の出力 do bangou = 1,kosuu write(*,'(i4,5f6.2)')bangou,kion1retsu(bangou), & kion1retsu_lowpass1(bangou),kion1retsu_highpass1(bangou), & kion1retsu_bandpass1a(bangou),kion1retsu_bandpass1b(bangou) end do contains ! ---------------------------------------------------------------------------- subroutine my_lowpass_filter(mae,ato,data_no_kosuu) ! 自分と前後1つずつを使った移動平均によるローパスフィルター real,dimension(1800),intent(in) :: mae ! 入力データの配列 real,dimension(1800),intent(out) :: ato ! 出力データの配列 integer,intent(in) :: data_no_kosuu ! 入力データの個数 integer :: i ! i = 1 のとき ato(1) = (mae(1)+mae(2))/2.0 ! 1 < i < data_no_kosuu のとき do i = 2,data_no_kosuu-1 ato(i) = (mae(i-1)+mae(i)+mae(i+1))/3.0 end do ! i = data_no_kosuu のとき ato(data_no_kosuu) = (mae(data_no_kosuu-1)+mae(data_no_kosuu))/2.0 end subroutine my_lowpass_filter ! ---------------------------------------------------------------------------- subroutine my_highpass_filter(mae,ato,data_no_kosuu) ! 自分と前後1つずつを使った移動平均によるハイパスフィルター real,dimension(1800),intent(in) :: mae ! 入力データの配列 real,dimension(1800),intent(out) :: ato ! 出力データの配列 integer,intent(in) :: data_no_kosuu ! 入力データの個数 real,dimension(1800) :: tochuu ! 中間的に使用するローパスフィルターの出力 integer :: i call my_lowpass_filter(mae,tochuu,data_no_kosuu) do i = 1,data_no_kosuu ato(i) = mae(i)-tochuu(i) end do end subroutine my_highpass_filter ! ---------------------------------------------------------------------------- end program enshu06gs