program enshu06fs ! バンドパスフィルターのサブルーチン版 implicit none integer :: seireki,tsuki,joutai,bangou,kosuu real,dimension(1800) :: kion1retsu,kion1retsu_lowpass1,& kion1retsu_highpass1,kion1retsu_bandpass1 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 ! もとのデータをローパスフィルターに通す call my_lowpass_filter(kion1retsu,kion1retsu_lowpass1,kosuu) ! もとのデータをハイパスフィルターに通す do bangou = 1,kosuu kion1retsu_highpass1(bangou) = & kion1retsu(bangou)-kion1retsu_lowpass1(bangou) end do ! ハイパスフィルター後のデータをローパスフィルターに通す call my_lowpass_filter(kion1retsu_highpass1,kion1retsu_bandpass1,kosuu) ! 結果の出力 do bangou = 1,kosuu write(*,'(i4,4f6.2)')bangou,kion1retsu(bangou), & kion1retsu_lowpass1(bangou),kion1retsu_highpass1(bangou) & ,kion1retsu_bandpass1(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 end program enshu06fs