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