Loại bỏ tiếng ồn từ trăn tín hiệu

Tôi đang ở xa thiết bị một thời gian, sẽ chia sẻ mẫu sau. Tiếng ồn rất có thể là từ cảm biến. Nó là gia tốc kế từ một imu. Không hiển thị 0 m/s^2 khi nghỉ, nảy xung quanh với số lượng nhỏ nhưng không bao giờ vượt quá một biên độ nhất định

Chúng ta sẽ tìm hiểu những kiến ​​thức cơ bản về phân tích Fourier và triển khai nó để loại bỏ nhiễu khỏi tín hiệu tổng hợp và tín hiệu thực

nội dung

  • Nhập thư viện, tạo tín hiệu và thêm tiếng ồn
  • Thực hiện biến đổi Fourier nhanh
  • Lọc ra tiếng ồn
  • Trực quan hóa kết quả
  • Khử nhiễu dữ liệu thực sử dụng ngưỡng công suất
  • Bộ lọc dựa trên obspy
  • kết luận
  • Người giới thiệu

Phân tích Fourier dựa trên ý tưởng rằng bất kỳ chuỗi thời gian nào cũng có thể được phân tách thành tổng tích phân của các sóng hài có tần số khác nhau. Do đó, về mặt lý thuyết, chúng ta có thể sử dụng một số sóng hài để tạo ra bất kỳ tín hiệu nào.

Chuỗi Fourier cho một hàm thời gian tùy ý \[f[t]\] được xác định trong khoảng [[-T/2 < t < T/2 ]] là

\begin{phương trình}

f[t] = a_0 + \sum_{n=1}^{\infty} a_n cos[\frac{2n\pi t}{T}] + \sum_{n=1}^{\infty} b_n sin[

\end{phương trình}

Trong phương trình trên, chúng ta có thể thấy rằng \[sin[\frac{2n\pi t}{T}]\] và \[cos[\frac{2n\pi t}{T}]\] tuần hoàn với . Ở đây, các giá trị lớn hơn của \[n\] tương ứng với khoảng thời gian ngắn hơn hoặc tần số cao hơn

Trong bài đăng này, chúng tôi sẽ sử dụng phân tích Fourier để lọc với giả định rằng nhiễu chồng lấp các tín hiệu trong miền thời gian nhưng không quá chồng chéo trong miền tần số

bài viết tương tự

Tính toán phổ hiệu quả cho tập dữ liệu lớn trong python

Cách vẽ các phép đo tách sóng biến dạng bằng pygmt

Cách tự động hỏi về sự sẵn có của dữ liệu địa chấn bằng obspy

Cách triển khai phương pháp newton–raphson lặp đi lặp lại để tìm gốc của một hàm trong python

Hiệu quả của việc khử nhiễu tín hiệu bằng cách sử dụng phân tích sóng con dựa trên MATLAB

Nhập thư viện, tạo tín hiệu và thêm tiếng ồn

import pandas as pd
import os, sys
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [10,6]
plt.rcParams.update[{'font.size': 18}]
plt.style.use['seaborn']

## Create synthetic signal
dt = 0.001
t = np.arange[0, 1, dt]
signal = np.sin[2*np.pi*50*t] + np.sin[2*np.pi*120*t] #composite signal
signal_clean = signal #copy for later comparison
signal = signal + 2.5 * np.random.randn[len[t]]
minsignal, maxsignal = signal.min[], signal.max[]

Chúng tôi đã tạo tín hiệu của mình bằng cách tính tổng hai hàm sin có tần số khác nhau [50Hz và 120Hz]. Sau đó, chúng tôi tạo ra một mảng nhiễu ngẫu nhiên và xếp chồng nhiễu đó lên tín hiệu

Thực hiện biến đổi Fourier nhanh

## Compute Fourier Transform
n = len[t]
fhat = np.fft.fft[signal, n] #computes the fft
psd = fhat * np.conj[fhat]/n
freq = [1/[dt*n]] * np.arange[n] #frequency array
idxs_half = np.arange[1, np.floor[n/2], dtype=np.int32] #first half index

Hàm fft.fft của Numpy trả về Biến đổi Fourier rời rạc một chiều bằng thuật toán Biến đổi Fourier nhanh [FFT] hiệu quả. Đầu ra của hàm rất phức tạp và chúng tôi đã nhân nó với liên hợp của nó để thu được phổ công suất của tín hiệu nhiễu. Chúng tôi đã tạo mảng tần số bằng cách sử dụng khoảng thời gian lấy mẫu [dt] và số lượng mẫu [n]

Biến đổi Fourier nhanh được áp dụng trên dữ liệu tổng hợp ồn ào

Lọc ra tiếng ồn

Trong biểu đồ trên, chúng ta có thể thấy rằng hai tần số từ tín hiệu ban đầu của chúng ta nổi bật. Bây giờ, chúng ta có thể tạo một bộ lọc có thể loại bỏ tất cả các tần số có biên độ nhỏ hơn ngưỡng của chúng ta

## Filter out noise
threshold = 100
psd_idxs = psd > threshold #array of 0 and 1
psd_clean = psd * psd_idxs #zero out all the unnecessary powers
fhat_clean = psd_idxs * fhat #used to retrieve the signal

signal_filtered = np.fft.ifft[fhat_clean] #inverse fourier transform

Trực quan hóa kết quả

## Visualization
fig, ax = plt.subplots[4,1]
ax[0].plot[t, signal, color='b', lw=0.5, label='Noisy Signal']
ax[0].plot[t, signal_clean, color='r', lw=1, label='Clean Signal']
ax[0].set_ylim[[minsignal, maxsignal]]
ax[0].set_xlabel['t axis']
ax[0].set_ylabel['Vals']
ax[0].legend[]

ax[1].plot[freq[idxs_half], np.abs[psd[idxs_half]], color='b', lw=0.5, label='PSD noisy']
ax[1].set_xlabel['Frequencies in Hz']
ax[1].set_ylabel['Amplitude']
ax[1].legend[]

ax[2].plot[freq[idxs_half], np.abs[psd_clean[idxs_half]], color='r', lw=1, label='PSD clean']
ax[2].set_xlabel['Frequencies in Hz']
ax[2].set_ylabel['Amplitude']
ax[2].legend[]

ax[3].plot[t, signal_filtered, color='r', lw=1, label='Clean Signal Retrieved']
ax[3].set_ylim[[minsignal, maxsignal]]
ax[3].set_xlabel['t axis']
ax[3].set_ylabel['Vals']
ax[3].legend[]

plt.subplots_adjust[hspace=0.4]
plt.savefig['signal-analysis.png', bbox_inches='tight', dpi=300]

Biến đổi Fourier nhanh được áp dụng trên dữ liệu tổng hợp ồn ào

Khử nhiễu dữ liệu thực sử dụng ngưỡng công suất

Tôi có bản ghi dữ liệu gia tốc kế bằng PhidgetSpatial Precision 0/0/3 Độ phân giải cao. Tôi đã chuyển đổi nó thành định dạng Miniseed để phân tích dễ dàng

# -*- coding: utf-8 -*-
# ======================================================================================================================================================
"""
Created on Thu Apr 29 12:41:26 2021

@author: Utpal Kumar [IES, Academia Sinica]
"""
# ======================================================================================================================================================

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [10,6]
plt.rcParams.update[{'font.size': 18}]
plt.style.use['seaborn']
from obspy import read
from obspy.core import UTCDateTime


otime = UTCDateTime['2021-04-18T22:14:37'] #eq origin

filenameZ = 'TW-RCEC7A-BNZ.mseed'

stZ = read[filenameZ]
streams = [stZ.copy[]]
traces = []
for st in streams:
    tr = st[0].trim[otime, otime+120]
    traces.append[tr]
    
delta = stZ[0].stats.delta
starttime = np.datetime64[stZ[0].stats.starttime]
endtime = np.datetime64[stZ[0].stats.endtime]
signalZ = traces[0].data/10**6
minsignal, maxsignal = signalZ.min[], signalZ.max[]

t = traces[0].times["utcdatetime"] 

## Compute Fourier Transform
n = len[t]
fhat = np.fft.fft[signalZ, n] #computes the fft
psd = fhat * np.conj[fhat]/n
freq = [1/[delta*n]] * np.arange[n] #frequency array
idxs_half = np.arange[1, np.floor[n/2], dtype=np.int32] #first half index
psd_real = np.abs[psd[idxs_half]] #amplitude for first half


## Filter out noise
sort_psd = np.sort[psd_real][::-1]
# print[len[sort_psd]]
threshold = sort_psd[300]
psd_idxs = psd > threshold #array of 0 and 1
psd_clean = psd * psd_idxs #zero out all the unnecessary powers
fhat_clean = psd_idxs * fhat #used to retrieve the signal

signal_filtered = np.fft.ifft[fhat_clean] #inverse fourier transform


## Visualization
fig, ax = plt.subplots[4,1]
ax[0].plot[t, signalZ, color='b', lw=0.5, label='Noisy Signal']
ax[0].set_xlabel['t axis']
ax[0].set_ylabel['Accn in Gal']
ax[0].legend[]

ax[1].plot[freq[idxs_half], np.abs[psd[idxs_half]], color='b', lw=0.5, label='PSD noisy']
ax[1].set_xlabel['Frequencies in Hz']
ax[1].set_ylabel['Amplitude']
ax[1].legend[]

ax[2].plot[freq[idxs_half], np.abs[psd_clean[idxs_half]], color='r', lw=1, label='PSD clean']
ax[2].set_xlabel['Frequencies in Hz']
ax[2].set_ylabel['Amplitude']
ax[2].legend[]

ax[3].plot[t, signal_filtered, color='r', lw=1, label='Clean Signal Retrieved']
ax[3].set_ylim[[minsignal, maxsignal]]
ax[3].set_xlabel['t axis']
ax[3].set_ylabel['Accn in Gal']
ax[3].legend[]

plt.subplots_adjust[hspace=0.6]
plt.savefig['real-signal-analysis.png', bbox_inches='tight', dpi=300]

Biến đổi Fourier nhanh áp dụng trên dữ liệu thực

Bộ lọc dựa trên obspy

Obspy làm cho nhiệm vụ của chúng tôi dễ dàng hơn nhiều bằng cách giới thiệu các chức năng bộ lọc. Ở đây, tôi đã sử dụng bộ lọc Butterworth-Bandpass. Để biết chi tiết về các loại bộ lọc khác nhau, bạn có thể xem tài liệu của nó

Trong ví dụ này, tôi đã sử dụng tần số góc thấp của băng thông là 0. 01 và tần số góc cao là 3 Hz dựa trên phổ tần số thu được ở trên

import pandas as pd
import os, sys
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [10,6]
plt.rcParams.update[{'font.size': 18}]
plt.style.use['seaborn']
from obspy import read
from obspy.core import UTCDateTime

otime = UTCDateTime['2021-04-18T22:14:37'] #eq origin

filenameZ = 'TW-RCEC7A-BNZ.mseed'

stZ = read[filenameZ]
streams = [stZ.copy[]]
traces = []
for st in streams:
    tr = st[0].trim[otime, otime+120]
    traces.append[tr]
    

signalZ = traces[0].data/10**6
minsignal, maxsignal = signalZ.min[], signalZ.max[]

t = np.arange[0, traces[0].stats.npts / traces[0].stats.sampling_rate, traces[0].stats.delta]

# Filtering with a lowpass on a copy of the original Trace
freqmin = 0.01
freqmax = 3
tr_filt = traces[0].copy[]
tr_filt.detrend["linear"]
tr_filt.taper[max_percentage=0.05, type='hann']
tr_filt.filter["bandpass", freqmin=freqmin,
                          freqmax=freqmax, corners=4, zerophase=True]
print[tr_filt.data/10**6]
signal_filtered = tr_filt.data/10**6

## Visualization
fig, ax = plt.subplots[2,1]
ax[0].plot[t, signalZ, color='b', lw=0.5, label='Noisy Signal']
ax[0].set_xlabel['t axis']
ax[0].set_ylabel['Accn in Gal']
ax[0].legend[]


ax[1].plot[t, signal_filtered, color='r', lw=1, label='Clean Signal Retrieved']
ax[1].set_xlabel['t axis']
ax[1].set_ylabel['Accn in Gal']
ax[1].set_title[f"Filtered in range {freqmin}-{freqmax} Hz"]
ax[1].legend[]

plt.subplots_adjust[hspace=0.4]
plt.savefig['real-signal-analysis.png', bbox_inches='tight', dpi=300]

Lọc thông dải bằng Obspy áp dụng trên dữ liệu thực

kết luận

Trong bài viết này, chúng tôi chỉ sử dụng loại bộ lọc cơ bản để loại bỏ tiếng ồn. Với bộ lọc nâng cao, chúng tôi có thể kiểm soát nhiều hơn trong việc loại bỏ các tần số nhưng khái niệm tổng thể rất giống nhau. Trong bài đăng tiếp theo, chúng ta sẽ xem cách chúng ta có thể sử dụng wavelet để loại bỏ nhiễu

Người giới thiệu

  1. Stein, S. , & Wysession, M. [2009]. Giới thiệu về địa chấn, động đất và cấu trúc trái đất

Thẻ. khử nhiễu , fft , bộ lọc , obspytutorial, obspy, signal processing, time-frequency analysis

Danh mục. kỹ thuật

Được tạo ra. 29 Tháng Tư, 2021

Bạn cũng có thể thưởng thức

Tính toán phổ hiệu quả cho tập dữ liệu lớn trong python

Đọc 3 phút      TIỆN ÍCH      Ngày 31 tháng 7 năm 2021

Librosa có thể tính toán phổ hiệu quả cho dữ liệu chuỗi thời gian lớn trong vài giây. Chúng tôi sẽ sử dụng điều đó để vẽ biểu đồ phổ bằng matplotlib

Cách vẽ các phép đo tách sóng biến dạng bằng pygmt

Đọc 2 phút      KỸ THUẬT      Ngày 01 tháng 7 năm 2021

Cách bạn có thể vẽ các phép đo tách sóng biến dạng từ cơ sở dữ liệu tách bằng PyGMT

Cách tự động hỏi về sự sẵn có của dữ liệu địa chấn bằng obspy

Đọc 2 phút      TIỆN ÍCH      Ngày 26 tháng 5 năm 2021

Trong bài đăng này, chúng ta sẽ xem làm cách nào chúng ta có thể truy xuất thông tin dạng sóng địa chấn có sẵn cho một mạng, trạm, kênh và máy khách nhất định trong một khoảng thời gian nhất định o

Cách triển khai phương pháp newton–raphson lặp đi lặp lại để tìm gốc của một hàm trong python

Đọc 3 phút      KỸ THUẬT      Ngày 25 tháng 5 năm 2021

Phương pháp Newton–Raphson [thường được gọi là phương pháp Newton] được phát triển để tìm nghiệm của một hàm hoặc đa thức đã cho theo cách lặp. Chúng tôi hiển thị hai bài kiểm tra

Tuyên bố miễn trừ trách nhiệm

Thông tin do Earth Inversion cung cấp chỉ được cung cấp cho mục đích giáo dục

Trong khi chúng tôi cố gắng giữ cho thông tin được cập nhật và chính xác. Earth Inversion không tuyên bố hay bảo đảm dưới bất kỳ hình thức nào, rõ ràng hay ngụ ý về tính đầy đủ, chính xác, đáng tin cậy, phù hợp hoặc khả dụng đối với trang web hoặc thông tin, sản phẩm, dịch vụ hoặc nội dung đồ họa có liên quan trên trang web cho bất kỳ mục đích nào.

TRONG MỌI TRƯỜNG HỢP, CHÚNG TÔI SẼ KHÔNG CHỊU TRÁCH NHIỆM PHÁP LÝ VỚI BẠN VỀ MẤT MẤT HOẶC THIỆT HẠI DƯỚI BẤT KỲ HÌNH THỨC NÀO PHÁT SINH DO VIỆC SỬ DỤNG TRANG WEB HOẶC TIN CẬY VÀO BẤT KỲ THÔNG TIN NÀO ĐƯỢC CUNG CẤP TRÊN TRANG WEB. BẤT KỲ SỰ TIN CẬY NÀO BẠN ĐẶT TRÊN TÀI LIỆU ĐÓ DO ĐÓ ĐỀU CHỊU RỦI RO CỦA RIÊNG BẠN

Chủ Đề