前提・実現したいこと
傾いているグラフを水平にする方法を、フーリエ変換を利用してやろうとしてます(直流成分を除く?)が、フーリエ変換の理解が浅いようで、うまくいきません。
例えば上図1で青い信号が得られたとします。これをオレンジのグラフのように修正したいのです。
該当のソースコード
python
1import numpy as np 2import matplotlib.pyplot as plt 3%matplotlib inline 4from scipy import signal 5 6N = 64 # サンプル数 7dt = 0.01 # サンプリング周期 8freq = 10 # 周波数 9amp = 1 # 振幅 10t = np.arange(0, N*dt, dt) # 時間軸 11f = amp * np.sin(2*np.pi * freq*t) + 0.5 * freq*t # 実験用の正弦波 12f0 = amp * np.sin(2*np.pi * freq*t) # 目標とする正弦波 13 14F = np.fft.fft(f) # 高速フーリエ変換(FFT) 15F_abs = np.abs(F) 16F_abs_amp = F_abs / N * 2 17F_abs_amp[0] = F_abs_amp[0] / 2 18 19angle = F_abs[0]/N/N*20 # 傾きを取得しているつもり 20 21fq = np.linspace(0, 1.0/dt, N) 22fig = plt.figure(figsize=(12, 4)) 23ax2 = fig.add_subplot(121) ## 信号のグラフ 24plt.xlabel('time(sec)') 25plt.ylabel('amp') 26plt.plot(t, f) 27plt.plot(t, f0) 28ax2 = fig.add_subplot(122) ## FFTのグラフ(周波数軸) 29plt.xlabel('freqency(Hz)') 30plt.ylabel('amp') 31plt.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1]) 32plt.show()
試したこと
python
1F_ifft = np.fft.ifft(F) # IFFT 2F_ifft_real = F_ifft.real * 2 # 振幅を元スケールに戻している 3 4F_minus = F_ifft_real - angle*t # ここで傾きを除去しているつもり 5 6plt.plot(t, F_ifft_real) 7plt.plot(t, F_minus, c="r") 8plt.show()
上記のようにフーリエ変換で直流成分をangle
として取り出し、元の信号から差し引いてやれば傾きが直ると思ったのですが、うまく行きませんでした。下図のようにほんの少ししか修正されません。
python
1F_ifft = np.fft.ifft(F[1:]) 2F_ifft_real = F_ifft.real * 2 3plt.plot(t[1:], F_ifft_real)
また、上述のようにFFT配列の0番目を除去して試したものの下図のようにこれもうまくいきません
傾きが直っている気配すらなく、どの辺がまずいのかもわからなくなってます。どうぞよろしく。
補足情報(FW/ツールのバージョンなど)
python 3(Colaboratory)
参考にしたサイト

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/06 11:27