添加高斯白噪声。
假设你的原始信号是一个csv文件,只有一列信号数据。现在要对这个信号添加不同分贝的高斯白噪声。代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取CSV文件
df = pd.read_csv('./hello/hello.csv', header=None)
# 获取第一列的值作为信号
signal = df.iloc[:, 0].values
# 计算原始信号的统计信息
original_max = np.max(signal)
original_min = np.min(signal)
original_mean = np.mean(signal)
print(f"Original Signal - Max: {original_max}, Min: {original_min}, Mean: {original_mean}")
# 计算信号的平均功率
signal_power = np.mean(signal**2)
# 目标噪声水平列表(分贝)
target_dBs = [20,16,14,12,10,8,4,2,0,-2,-4]
# 准备一个DataFrame来存储所有噪声信号
noisy_signals_df = pd.DataFrame()
# 显示原始信号的前4096个数据点的波形图
plt.figure(figsize=(10, 2))
plt.plot(signal[:4096], label='Original Signal')
plt.title('Original Signal Waveform (First 4096 points)')
plt.xlabel('Sample Index')
plt.ylabel('Amplitude')
plt.legend()
plt.show()
# 生成不同分贝水平的噪声并输出统计信息
for target_dB in target_dBs:
# 计算噪声功率
noise_power = signal_power * 10**(target_dB / 10)
# 噪声的标准差是噪声功率的平方根
noise_std = np.sqrt(noise_power)
# 生成高斯白噪声
noise = np.random.normal(0, noise_std, signal.shape[0])
# 添加噪声到信号
noisy_signal = signal + noise
# 计算添加噪声后的信号的统计信息
noisy_max = np.max(noisy_signal)
noisy_min = np.min(noisy_signal)
noisy_mean = np.mean(noisy_signal)
print(f"Noisy Signal ({target_dB} dB) - Max: {noisy_max}, Min: {noisy_min}, Mean: {noisy_mean}")
# 将噪声信号添加到DataFrame
noisy_signals_df[f'signal_{target_dB}dB'] = noisy_signal
# 显示添加噪声后的信号的前4096个数据点的波形图
plt.figure(figsize=(10, 2))
plt.plot(noisy_signal[:4096], label=f'Noisy Signal {target_dB}dB')
plt.title(f'Noisy Signal Waveform at {target_dB}dB (First 4096 points)')
plt.xlabel('Sample Index')
plt.ylabel('Amplitude')
plt.legend()
plt.show()
# 将包含所有噪声信号的DataFrame保存到新的CSV文件
noisy_signals_df.to_csv('./OK/OK+noisy.csv', index=False)
用matlab操作方便。