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