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
]
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]
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]
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]
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
- 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