fft信道中噪声的消除

2024-09-27 20:15:12 发布

您现在位置:Python中文网/ 问答频道 /正文

你知道如何从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 还有一些代码:

^{pr2}$

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

如你所见,韦尔奇配置良好,它显示了60赫兹的电力线,和谐波模式。这几乎是好的,但它完全抚平了我的阴谋。如图2所示。顺便说一句,在韦尔奇图上,y比例是错误的,但这只是两个人的功率数据。在

我改成了nperseg=8192,它起作用了。看看结果。 enter image description here


Tags: infftforsizenppltdatasetcolor
1条回答
网友
1楼 · 发布于 2024-09-27 20:15:12

下面是一个示例,演示如何使用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()

相关问题 更多 >

    热门问题