svd奇异值分解信号降噪Python代码
时间: 2025-05-15 18:07:41 浏览: 35
### 基于SVD的信号降噪方法
奇异值分解(SVD)是一种强大的线性代数工具,广泛应用于数据压缩、图像处理以及信号降噪等领域。通过保留较大的奇异值并忽略较小的奇异值,可以有效去除噪声成分。
以下是基于Python实现SVD对信号进行降噪的具体代码:
#### 示例代码
```python
import numpy as np
import matplotlib.pyplot as plt
def add_noise(signal, noise_factor=0.1):
"""向原始信号添加随机高斯噪声"""
noisy_signal = signal + noise_factor * np.random.normal(size=len(signal))
return noisy_signal
def svd_denoise(noisy_signal, k=None):
"""
使用SVD对带噪信号进行去噪
参数:
noisy_signal (numpy.ndarray): 输入的含噪信号.
k (int): 要保留的最大奇异值数量,默认为None表示自动选择.
返回:
denoised_signal (numpy.ndarray): 去噪后的信号.
"""
# 将一维信号转换为二维矩阵形式以便应用SVD
matrix_form = np.expand_dims(noisy_signal, axis=0)
# 进行奇异值分解
U, s, VT = np.linalg.svd(matrix_form, full_matrices=False)
if k is None:
# 自动选择k:累积能量占比达到95%以上的最小奇异值数目
total_energy = np.sum(s ** 2)
cumulative_energy = np.cumsum(s ** 2) / total_energy
k = np.argmax(cumulative_energy >= 0.95) + 1
# 截断奇异值及其对应的U和VT分量
s_truncated = np.diag(s[:k])
U_truncated = U[:, :k]
VT_truncated = VT[:k, :]
# 重构信号
reconstructed_matrix = U_truncated @ s_truncated @ VT_truncated
denoised_signal = np.squeeze(reconstructed_matrix)
return denoised_signal
# 创建一个简单的正弦波作为干净信号
clean_signal = np.sin(np.linspace(0, 10, 100))
# 添加噪声到清洁信号中
noisy_signal = add_noise(clean_signal, noise_factor=0.3)
# 对带噪信号执行SVD去噪操作
denoised_signal = svd_denoise(noisy_signal)
# 可视化结果
plt.figure(figsize=(12, 8))
plt.plot(clean_signal, label="Clean Signal", color='green')
plt.plot(noisy_signal, label="Noisy Signal", linestyle="--", alpha=0.7, color='red')
plt.plot(denoised_signal, label="Denoised Signal", color='blue', linewidth=2)
plt.legend()
plt.title("Signal Denoising using SVD")
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.show()
```
上述代码实现了以下几个功能:
- `add_noise` 函数用于生成带有随机高斯噪声的信号[^1]。
- `svd_denoise` 是核心函数,它接受输入的一维信号,并利用SVD对其进行降噪。如果未指定参数 \( k \),则会根据累计能量比例自动选取合适的截断阈值[^2]。
- 最终通过可视化展示原信号、加噪后信号及去噪后信号的效果对比[^3]。
#### 注意事项
为了获得最佳效果,在实际应用过程中可能需要调整噪声因子或手动设置 \( k \) 的取值范围来优化性能。
阅读全文
相关推荐


















