关于去除信号中的直流分量效果演示(零频率分量)

本文详细介绍了如何通过快速傅里叶变换(FFT)去除信号中的直流分量(零频率分量),这对于关注信号变化而非平均值的频谱分析至关重要。作者提供了相关代码示例,展示了如何通过调整频率谱以突出信号的变动和周期性特征。
摘要由CSDN通过智能技术生成

img

本文作者: slience_me


关于去除信号中的直流分量效果演示(零频率分量)

1. 效果图展示:

image-20240120175207877

2. 快速傅里叶变换FFT

def FFT_for_Period(x, k=2):
    xf = torch.fft.rfft(x, dim=1)
    frequency_list = abs(xf).mean(0).mean(-1)
    frequency_list[0] = 0
    _, top_list = torch.topk(frequency_list, k)
    top_list = top_list.detach().cpu().numpy()
    period = x.shape[1] // top_list
    return period, abs(xf).mean(-1)[:, top_list]

frequency_list[0] 置零可能是为了去除直流分量(零频率分量)的影响。在频率谱中,索引为0的位置通常对应于零频率,也就是直流成分。

直流成分表示信号的平均值或偏移。在某些情况下,我们可能对信号的变化更感兴趣,而不是整个信号的平均值。通过将 frequency_list[0] 置零,我们可以去除直流成分的影响,更关注信号中的变化和其他频率成分。

这种操作在信号处理和频谱分析中是常见的,特别是当我们关注信号的变化或周期性成分而不关心平均水平时。它有助于突出频谱中的其他特征,使得分析更加集中于信号的变动和周期性。

关于直流分量的解释

直流分量是信号中的恒定成分,通常表示信号的平均值或直流偏移。直流分量不随时间变化,它是信号在水平方向上的偏移或平移。

让我们通过一个直观的例子来理解直流分量:

假设有一个以时间为横轴的信号图,其中纵轴表示信号的振幅。如果信号在整个时间范围内都有一个常数振幅,那么这个信号就包含直流分量。直流分量的存在会使整个信号在纵轴上发生平移,即整个信号的基准水平线上下移动。

举个例子,考虑一个表示温度的信号。如果这个信号中存在直流分量,那么它可能表示一个常数的环境温度,而信号的波动则表示温度随时间的变化。直流分量可以看作是整个信号的平均温度,而波动则反映了温度相对于平均值的变化。

在频谱分析中,直流分量通常对应于频谱中的零频率分量,即索引为0的位置。通过将直流分量从频谱中去除,我们可以更专注于信号中变化的频率成分,而不受整体平移的影响。这在很多信号处理任务中是有用的,特别是当我们关注信号的变动和周期性成分时。

3. 相关验证代码

import numpy as np
import matplotlib.pyplot as plt
import torch

def generate_irregular_waveform_with_large_dc(duration, sampling_rate):
    t = np.arange(0, duration, 1 / sampling_rate)
    # 生成不规则的波形,包含直流分量
    waveform = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 12 * t) + 2.0  # 增大直流分量
    return t, waveform

# 设置不规则波形的参数
duration = 2  # 波形持续时间(秒)
sampling_rate = 1000  # 采样率

# 生成不规则波形数据(包含直流分量)
t, waveform_with_dc = generate_irregular_waveform_with_large_dc(duration, sampling_rate)

# 转换为PyTorch张量
x_with_dc = torch.tensor(waveform_with_dc, dtype=torch.float32)

# 不去掉直流分量的傅里叶变换
xf_with_dc = torch.fft.rfft(x_with_dc)
print("不去掉直流分量")
print("xf.shape: {}".format(xf_with_dc.shape))
frequency_list = abs(xf_with_dc)
print("frequency_list: {}".format(frequency_list))
_, top_list = torch.topk(frequency_list, 2)
print("top_list: {}".format(top_list))

# 提取频率信息
xf_freq = np.fft.fftfreq(len(waveform_with_dc), d=1 / sampling_rate)

plt.figure(figsize=(24, 16))
# 绘制原始波形图
plt.subplot(4, 1, 1)
plt.plot(t, waveform_with_dc)
plt.title('Original Waveform (with DC Component)')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.grid(True)

# 绘制不去掉直流分量的频谱图
plt.subplot(4, 1, 2)
plt.plot(xf_freq[:len(xf_with_dc)], torch.abs(xf_with_dc))
plt.title('Frequency Spectrum (without Removing DC Component)')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.grid(True)

# 去掉直流分量
x_without_dc = x_with_dc - torch.mean(x_with_dc)
print("去掉直流分量")
print("xf.shape: {}".format(xf_with_dc.shape))
frequency_list = abs(xf_with_dc)
print("frequency_list: {}".format(frequency_list))
_, top_list = torch.topk(frequency_list, 2)
print("top_list: {}".format(top_list))

# 进行傅里叶变换
xf_without_dc = torch.fft.rfft(x_without_dc)

# 提取频率信息
xf_freq_without_dc = np.fft.fftfreq(len(waveform_with_dc), d=1 / sampling_rate)

# 绘制去掉直流分量后的波形图
plt.subplot(4, 1, 3)
plt.plot(t, x_without_dc.numpy())
plt.title('Waveform without DC Component')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.grid(True)

# 绘制去掉直流分量后的频谱图
plt.subplot(4, 1, 4)
plt.plot(xf_freq_without_dc[:len(xf_without_dc)], torch.abs(xf_without_dc))
plt.title('Frequency Spectrum')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.grid(True)

plt.tight_layout()
plt.show()
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要滤除数字信号直流分量和高次谐波,可以采用以下几种常用的方法: 1. 高通滤波(High Pass Filtering): 高通滤波器可以滤除信号直流分量。它允许通过高于某个截止频率频率成分,而阻止低于该截止频率频率成分。通过选择适当的截止频率,可以将信号直流分量去除。 2. 低通滤波(Low Pass Filtering): 低通滤波器可以滤除信号的高次谐波。它允许通过低于某个截止频率频率成分,而阻止高于该截止频率频率成分。通过选择适当的截止频率,可以将信号的高次谐波去除。 3. 带阻滤波(Band Stop Filtering): 带阻滤波器(也称为陷波滤波器)可以同时滤除直流分量和特定的高次谐波。它允许通过某个带宽范围内的频率成分,而阻止该范围之外的频率成分。选择适当的带宽和频率可以实现对直流分量和高次谐波的滤除。 4. 数字滤波器设计: 使用数字滤波器设计方法,可以根据具体的滤波需求和要求,设计并实现用于滤除直流分量和高次谐波的滤波器。数字滤波器可以基于时域或频域的方法进行设计,例如FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器等。 以上是一些常用的方法,可以用于滤除数字信号直流分量和高次谐波。具体选择哪种方法应根据信号特性、滤波要求、计算资源和实时性等方面进行综合考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

slience_me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值