位相の異なる正弦波の足し合わせ

図の上下とも、赤線は周波数0.5Hzの正弦波、青線は0.6Hzの正弦波です。どちらの正弦波も振幅は1.0としています。2つの正弦波を足し合わせたものが、両図とも太い黒線で示したものになります。この太黒線にFFTを実施して振幅スペクトルを描くと両者とも全く同じになります。

上下の違いは、青線で示した0.6Hzの正弦波の位相だけです。しかし、位相の異なる正弦波を足し合わせると、その最大値は全く違う値となります。

f:id:S_E_Hyphen:20180113075635j:plain

太黒線だけが与えられていて、仮にローパスフィルタで0.6Hzを取り除いたならば、上図の場合は最大振幅が小さくなりますが、下図の場合は除去後の方が大きな値となることでしょう。

 

 

#!/bin/bash
temp=`mktemp ./XXXX.tmp`
temp2=`mktemp ./XXXX.tmp`
otfile=test
gmt gmtset FONT_TITLE 16p,GothicBBB-Medium-UniJIS-UTF8-H

scilab -nw << _SCILAB_
fs=100; //サンプリング周波数
ns=8192; //サンプル数
t=[0:1/fs:(ns-1)/fs];

fp_a=0.5; // 正弦波の周波数
a=sin(2*%pi*fp_a*t);
fp_b=0.6;
phi_b=180*%pi/180;
b=sin(2*%pi*fp_b*t+phi_b);
c=a+b;
max(c)
fd=mopen('$temp','w');
for k=1:ns,
mfprintf(fd,"%f %f %f\n",t(k),a(k),b(k));
end
mclose(fd);

x=fft(c,-1);
fs=1/t(2);
f=[0:fs/ns:100];
fd=mopen('${temp2}','w');
for k=1:ns,
mfprintf(fd,"%f %f\n",f(k),abs(x(k)));
end
mclose(fd);

_SCILAB_

cat $temp |\
 awk '{print $1,$2}' |\
 gmt psxy -JX15c/5c -R0/1/-2.2/2.2 -BnSeW \
   -Bxa0.1+l"sec" -Bya0.5 -W0.5p,red -K > $otfile.ps
cat $temp |\
 awk '{print $1,$3}' |\
 gmt psxy -J -R -B -W0.5p,blue -O -K >> $otfile.ps
cat $temp |\
 awk '{print $1,$2+$3}' |\
 gmt psxy -J -R -B -W1p,black -O -K >> $otfile.ps
cat << + |\
gmt pslegend -R -J -Dx12c/4.8c+w2.5c/1.2c+jTL -F+p+gwhite -O -K >> $otfile.ps
N 1
S 0.2c s 0.3c 255/0/0 0.0p 0.5c 0.5Hz
G 0.02c
S 0.2c s 0.3c 0/0/255 0.0p 0.5c 0.6Hz
+
printf "0.8 -1.9 max=%.2f\n" 0.59 |\
 gmt pstext -J -R -F+jBL+a0.0+f12p,Helvetica,0/0/0 -O -K >> $otfile.ps 

cat ${temp2} |\
 gmt psxy -JX5c/5c -R0/1/0/2000 -BnSeW+t"振幅スペクトル" \
   -Bxa0.2+l"Hz" -Bya500 -W1.0p,black -X18c -O -K >> $otfile.ps

scilab -nw << _SCILAB_
fs=100; //サンプリング周波数
ns=8192; //サンプル数
t=[0:1/fs:(ns-1)/fs];

fp_a=0.5; // 正弦波の周波数
a=sin(2*%pi*fp_a*t);
fp_b=0.6;
phi_b=0*%pi/180;
b=sin(2*%pi*fp_b*t+phi_b);
c=a+b;
max(c)
fd=mopen('$temp','w');
for k=1:ns,
mfprintf(fd,"%f %f %f\n",t(k),a(k),b(k));
end
mclose(fd);

x=fft(c,-1);
fs=1/t(2);
f=[0:fs/ns:100];
fd=mopen('${temp2}','w');
for k=1:ns,
mfprintf(fd,"%f %f\n",f(k),abs(x(k)));
end
mclose(fd);

_SCILAB_

cat $temp |\
 awk '{print $1,$2}' |\
 gmt psxy -JX15c/5c -R0/1/-2.2/2.2 -BnSeW \
   -Bxa0.1+l"sec" -Bya0.5 -W0.5p,red -X-18c -Y8c -O -K >> $otfile.ps
cat $temp |\
 awk '{print $1,$3}' |\
 gmt psxy -J -R -B -W0.5p,blue -O -K >> $otfile.ps
cat $temp |\
 awk '{print $1,$2+$3}' |\
 gmt psxy -J -R -B -W1p,black -O -K >> $otfile.ps
cat << + |\
gmt pslegend -R -J -Dx12c/4.8c+w2.5c/1.2c+jTL -F+p+gwhite -O -K >> $otfile.ps
N 1
S 0.2c s 0.3c 255/0/0 0.0p 0.5c 0.5Hz
G 0.02c
S 0.2c s 0.3c 0/0/255 0.0p 0.5c 0.6Hz
+
printf "0.8 -1.9 max=%.2f\n" 1.98 |\
 gmt pstext -J -R -F+jBL+a0.0+f12p,Helvetica,0/0/0 -O -K >> $otfile.ps 

cat ${temp2} |\
 gmt psxy -JX5c/5c -R0/1/0/2000 -BnSeW+t"振幅スペクトル" \
   -Bxa0.2+l"Hz" -Bya500 -W1.0p,black -X18c -O >> $otfile.ps

rm $temp ${temp2}