后续将给大家分享信号处理基础系列文章,本期是讲噪声相关知识,包括噪声的定义、分类及python代码实现。
噪声是信息信号在传输过程中所受到的各种各样干扰信号的总成,其直接影响信号的传输质量,甚至破坏正常的信号。通俗地,噪声定义为信号中的无用信号成分,噪声信号混杂在原始信号中,引起信号的失真。
噪声也可以指包含很多频率的信号,即信号的频谱呈现随机性。噪声无处不在,在一些场合,噪声可以被利用,进而分析和观察系统的输出特性。
为了排除噪声的影响,DSP最重要的应用之一是消除信号中的噪声。
乘性噪声:噪声和信道内传输的信号之间存在相乘的关系,随着信号的存在而存在,当信号消失后,乘性噪声也将湮没。
其功率谱密度可表示为:
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib
# 生成白噪声
n_sampling = 10000
fs = 1000
white_noise = np.random.normal(0,5,n_sampling)
t = np.linspace(0, n_sampling / fs, n_sampling)
# 计算功率谱
p = fftpack.fft(white_noise)
power = np.abs(p)**2 # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power) # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs) # 计算频率
fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, white_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:n_sampling//2], power_db[0:n_sampling//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()
图1 白噪声及其功率谱
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib
# 生成红噪声
n_sampling = 10000
fs = 1000
std = 3
white_noise = np.random.normal(0,5,n_sampling)
red_noise = np.cumsum(white_noise)
red_noise = red_noise / np.max(np.abs(red_noise)) * std
t = np.linspace(0, n_sampling / fs, n_sampling)
# 计算功率谱
p = fftpack.fft(red_noise)
power = np.abs(p)**2 # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power) # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs) # 计算频率
fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, red_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:n_sampling//2], power_db[0:n_sampling//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()
import numpy as np
from scipy import fftpack, signal
import matplotlib.pyplot as plt
import matplotlib
# 生成蓝噪声
n_sampling = 10000
fs = 1000
exponent = -1.5
white_noise = np.random.normal(0,5,n_sampling)
b, a = signal.butter(1, 0.5, 'high')
blue_noise = signal.lfilter(b, a, white_noise)
t = np.linspace(0, n_sampling / fs, n_sampling)
# 计算功率谱
p = fftpack.fft(blue_noise)
power = np.abs(p)**2 # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power) # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs) # 计算频率
fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, blue_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:n_sampling//2], power_db[0:n_sampling//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib
# 生成紫噪声
n_sampling = 10000
fs = 1000
white_noise = np.random.normal(0,5,n_sampling)
purple_noise = np.diff(white_noise, 2)
t = np.linspace(0, len(purple_noise) / fs, len(purple_noise))
# 计算功率谱
p = fftpack.fft(purple_noise)
power = np.abs(p)**2 # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power) # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs) # 计算频率
fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, purple_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:len(purple_noise)//2], power_db[0:len(purple_noise)//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()
import numpy as np
def generate_pink_or_black_noise(samples, sample_rate, alpha):
"""
这里的alpha参数决定了噪声的颜色。alpha=1.0对应于粉噪声。如果你想生成其他颜色的噪声,
可以改变这个参数。例如,alpha=1.5将生成黑噪声,alpha=0.0将生成白噪声。
"""
omega = np.fft.fftfreq(samples, d=1./sample_rate)
s_scale = omega
s_scale[0] = 1
sr = np.random.normal(scale=np.sqrt(np.abs(s_scale)**-alpha))
si = np.random.normal(scale=np.sqrt(np.abs(s_scale)**-alpha))
s = sr + 1j*si
y = np.fft.ifft(s).real
return y
# 使用函数生成粉噪声
pink_noise = generate_pink_or_black_noise(10000, sample_rate, alpha)
作者:陈凯歌
编辑:陈凯歌
校核:李正平、张勇、张泽明、王畅、赵栓栓