时间序列信号的信噪比计算方案

在许多应用中,时间序列信号中往往伴随着各种噪声,这会影响信号的质量。在处理信号时,计算信噪比(Signal-to-Noise Ratio, SNR)是一个重要的指标,常用来评估信号的纯净程度。本方案旨在提供一系列步骤,利用Python从时间序列信号中获取纯净信号,并计算信噪比。

一、方案概述

目标

  • 从噪声时间序列中提取纯净信号。
  • 计算并评估信号的信噪比。

方法

  1. 信号生成:创建一个带有噪声的时间序列信号。
  2. 信号去噪:使用滤波器去除噪声,获得纯净信号。
  3. 信噪比计算:基于纯净信号和噪声信号计算信噪比。

二、信号生成

我们将生成一个简单的正弦波信号,并加入一些高斯噪声。以下是代码示例:

import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子 
np.random.seed(0)

# 生成时间轴
t = np.linspace(0, 1, 1000)

# 创建正弦信号
frequency = 5  # 频率
pure_signal = np.sin(2 * np.pi * frequency * t)

# 加入高斯噪声
noise = np.random.normal(0, 0.5, pure_signal.shape)
noisy_signal = pure_signal + noise

# 可视化信号
plt.figure(figsize=(12, 6))
plt.plot(t, noisy_signal, label='Noisy Signal')
plt.plot(t, pure_signal, label='Pure Signal', linestyle='--')
plt.title('Signal Generation')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()
plt.show()

旅行图

在代码执行中,信号从生成到展示的过程如下所示:

journey
    title 信号生成过程
    section 生成时间轴
      生成时间数据: 5: 加载时间数据
    section 创建正弦信号
      生成正弦信号: 5: 创建正弦波
    section 加入噪声
      噪声添加: 5: 加入高斯噪声
    section 可视化信号
      信号可视化: 5: 展示生成的信号

三、信号去噪

信号去噪常用的方法是使用低通滤波器。以下代码示例展示了如何进行信号去噪。

from scipy.signal import butter, filtfilt

def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    return b, a

def lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = filtfilt(b, a, data)
    return y

# 设置滤波参数
fs = 1000      # 采样频率
cutoff = 10    # 截止频率

# 进行信号去噪
filtered_signal = lowpass_filter(noisy_signal, cutoff, fs)

# 可视化去噪信号
plt.figure(figsize=(12, 6))
plt.plot(t, noisy_signal, label='Noisy Signal')
plt.plot(t, filtered_signal, label='Filtered Signal', linestyle='--')
plt.title('Signal Denoising')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()
plt.show()

关系图

上述流程中,生成的信号与滤波器的关系如下:

erDiagram
    NOISYSIGNAL {
        string id
        float amplitude
        float frequency
    }
    FILTEREDSIGNAL {
        string id
        float amplitude
    }
    
    NOISYSIGNAL ||--|| FILTEREDSIGNAL : "经过低通滤波器"

四、信噪比计算

接下来,我们需要计算信噪比,信噪比的定义为纯净信号和噪声信号的比例。以下是计算信噪比的代码示例:

def calculate_snr(signal, noise):
    signal_power = np.mean(signal ** 2)
    noise_power = np.mean(noise ** 2)
    snr = 10 * np.log10(signal_power / noise_power)
    return snr

# 计算噪声
extracted_noise = noisy_signal - filtered_signal

# 计算信噪比
snr = calculate_snr(pure_signal, extracted_noise)
print(f"信噪比 (SNR): {snr:.2f} dB")

五、总结

本方案展示了如何从时间序列信号中提取纯净信号并计算信噪比的全过程。通过生成带噪声的信号、应用低通滤波器去噪声以及计算信噪比,能够有效评估信号的纯净程度。这些步骤在实际应用中广泛使用于信号处理、通信和数据分析等领域。

希望本方案能够为您在处理时间序列信号时提供帮助。如需深入了解,可针对不同的噪声模型及滤波技术进行进一步研究和实验。