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

어떤 아이디어가? 웰치가 작동하지 않으므로 차트를 부드럽게하고 싶지는 않지만 두 번째 그림에 표시된 수준으로 너무 많은 노이즈를 지우고 싶습니다. 당신이 할 수

# 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 축척이 잘못되었지만 두 축척에 대한 전력 데이터의 경우에 불과합니다.

nperseg = 8192로 변경되었으며 효과가있었습니다. 결과를보십시오. 여기 enter image description here

+1

당신은 소음 "을 지울 수 없습니다"를; 스펙트럼 밀도 추정에 원시 FFT를 사용할 때 특히 그렇습니다. Welch가 당신을 위해 작동하지 않는다고 생각하는 이유는 무엇입니까? 아래 그림은 Welch가 생산할 것으로 기대되는 것과 정확하게 같습니다. – kazemakase

+0

원인 welch는 다음과 같습니다 (질문 참조). 당신은 내 아이디어로 무엇을 할 수 있습니까? – 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

큰 이걸 도와 주셔서 감사합니다 :) 건배 남자. 나는 주제가 끝난 것 같아요. – Hiddenguy