2017-12-04 3 views
2

FFTからノイズを多く削除する方法は知っていますか?ここ は、FFTの私のコードです:私が得るfftチャートからノイズを消去する

import numpy as np 

fft1 = (Bx[51:-14]) 
fft2 = (By[1:-14]) 


# Loop for FFT data 
for dataset in [fft1]: 
    dataset = np.asarray(dataset) 
    psd = np.abs(np.fft.fft(dataset))**2 
    freq = np.fft.fftfreq(dataset.size, float(300)/dataset.size) 
    plt.semilogy(freq[freq>0], psd[freq>0]/dataset.size**2, color='r') 


for dataset2 in [fft2]: 
    dataset2 = np.asarray(dataset2) 
    psd2 = np.abs(np.fft.fft(dataset2))**2 
    freq2 = np.fft.fftfreq(dataset2.size, float(300)/dataset2.size) 
    plt.semilogy(freq2[freq2>0], psd2[freq2>0]/dataset2.size**2, color='b') 

何: enter image description here

私は必要なもの: enter image description here

任意のアイデア?ウェルチはうまくいかないので、私は自分のチャートを滑らかにしたくないが、2枚目の画像に表示されているレベルまでノイズをあまり消したくない。することができますように

# Loop for FFT data 
for dataset in [fft1]: 
    dataset = np.asarray(dataset) 
    freqs, psd = welch(dataset, fs=266336/300, window='hamming', nperseg=512) 
    plt.semilogy(freqs, psd/dataset.size**2, color='r') 

for dataset2 in [fft2]: 
    dataset2 = np.asarray(dataset2) 
    freqs2, psd2 = welch(dataset2, fs=266336/300, window='hamming', nperseg=512) 
    plt.semilogy(freqs2, psd2/dataset2.size**2, color='b') 

enter image description here とコードのビット:

freqs, psd = scipy.signal.welch(dataset, fs=300, window='hamming') 

更新ウェルチ: enter image description here

コードのビット

これは、ウェルチは何をすべきかですWelchはうまく構成されているのを見てください。それは60Hzの電力線と高調波モードを示しています。それはほとんど良いですが、それは私のプロットを完全に平滑化しました。望ましいグラフ2を参照してください。 Btw。 Welchプロットではyスケールが間違っていますが、2つのデータのパワーデータの場合に過ぎません。

私はnperseg = 8192に変更しました。結果を見てください。ここ enter image description here

+1

あなたは、ノイズを「消去」することはできません。スペクトル密度の推定に生のFFTを使用する場合は特にそうです。 Welchはあなたのために働いていないと思いますか?下のプロットは、私がWelchが作り出すと思うものとまったく同じように見えます。 – kazemakase

+0

原因ウェルチはこのように見えます(質問を参照)。あなたは私のデータで何をすべきか考えていますか? – Hiddenguy

+1

'welch'は引数' nperseg'を持っています。値を大きくするほど周波数分解能が向上し、値を小さくするほどノイズが減少します。 'signal.welch(dataset、fs = 300、window = 'hamming'、nperseg = 256)で始まり、ノイズがまだ許容できる場合は' nperseg = 512'を試してください。私はあなたがそれらのための感情を得るために値で遊ぶことをお勧めします( 'noverlap'引数を見てください)。 – kazemakase

答えて

4

ノイズ低減のトレードオフ対周波数分解能を制御するnpersegを使用する方法を示す例である:信号の長さにnperseg設定

enter image description here

は多かれ少なかれ同等です平均化を行わずにFFTを使用します。ここで

は、このイメージを生成するためのコードです:

import numpy as np 
from scipy import signal 
import matplotlib.pyplot as plt 

plt.figure(figsize=[8, 12]) 

n = 2**21 
fs = 887 

# example data 
x = np.random.randn(n) 
x += np.sin(np.cumsum(0.42 + np.random.randn(n) * 0.01)) * 5 
x = signal.lfilter([1, 0.5], 2, x) 

plt.subplot(3, 2, 1) 
plt.semilogy(np.abs(np.fft.fft(x)[:n//2])**2/n**2, label='FFT') 
plt.legend(loc='best') 

for i, nperseg in enumerate([128, 512, 8192, 65536, n]): 
    plt.subplot(3, 2, i+2) 
    f, psd = signal.welch(x, fs=fs, window='hamming', nperseg=nperseg, noverlap=0) 
    plt.semilogy(f, psd, label='nperseg={}'.format(nperseg)) 
    plt.legend(loc='best') 

plt.show() 
+0

Bigはこれで私を助けてくれてありがとう:)乾杯の男。トピックが終わったと思います。 – Hiddenguy

関連する問題