python - 消除 fft 图表中的噪音

标签 python python-2.7 numpy fft noise

你知道如何从 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

有什么想法吗?韦尔奇不起作用,所以如您所见,我不想平滑我的图表,而是将如此多的噪音消除到第二张图片中呈现的水平。

这就是韦尔奇所做的: enter image description here 和一些代码:

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

韦尔奇更新: 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')

正如您所看到的,Welch 配置良好,它显示 60 Hz 电力线和谐波模式。几乎不错,但它完全平滑了我的情节。参见所需的图二。顺便提一句。韦尔奇图上的 y 尺度是错误的,但这只是两者的功率数据的情况。

我已更改为 nperseg=8192 并且有效。看看结果。 enter image description here

最佳答案

以下示例展示了如何使用 nperseg 来控制频率分辨率与降噪权衡:

enter image description here

nperseg设置为信号的长度或多或少相当于使用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()

关于python - 消除 fft 图表中的噪音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47630350/

相关文章:

python - 在 Python 中并排连接列表中的单词

python - 在 lambda 中访问函数的 __doc__

python - 将 Numpy 数组中最终作为单独数组的所有元素更改为 float Python

python - 如何删除列或数据框中的括号

python - Unicode 字符无法在终端 python 中正确打印

python - 使用 MySQL UDF 执行命令 - sys_exec 不起作用

python - 如何正确构建自引用 SQLalchemy 邻接列表混合

python - 无法将打印功能输出发送到文件并在执行期间出错

python - 交换字符串中的每一对字符

python - 如何将任意字典存储到文件中,以便也可以在 Fortran 中读取它?