本章的“噪声”:一个信号中包含很多频率,这样它就没有周期信号的谐波结构了
4.1 不相关噪声
不相关均匀噪声(UU noise):“不相关”意思是各个值是相互独立的,知晓一个值不能得到其他值的信息,“均匀”意思是信号包含的随机值服从均匀分布
UncorrelatedUniformNoise继承与_Noise,而后者继承于Signal
class UncorrelatedUniformNoise(_Noise):
def evaluate(self, ts):
ys = np.random.uniform(-self.amp, self.amp, len(ts))
return ys
signal = thinkdsp.UncorrelatedUniformNoise()
wave = signal.make_wave(duration=0.5, framerate=11025)
spectrum = wave.make_spectrum()
spectrum.plot_power()
spectrum.plot_power()绘制的是能量,它是振幅的平方
对一个噪声信号或者它的频谱,我们可能至少需要了解:
- 分布:随机信号的分布是指可能值的集合和对应出现的可能性。
- 相关性:信号的值在某个特定时间很高,我们希望它保持很高的水平,反之亦然。
- 能量和频率的关系:频率的能量按照该频率绘制 P = k / f β P=k/f^{\beta} P=k/fβ
4.2 累积频率
def make_integrated_spectrum(self):
cs = np.cumsum(self.power)
cs /= cs[-1]
return IntegratedSpectrum(cs, self.fs)
class IntegratedSpectrum(object):
def _init_(self, cs, fs):
self.cs = cs
self.fs = fs
integ = spectrum.make_integrated_spectrum()
integ.plot_power()
是一条直线,这意味着能量在所有的频率处的均值是一致的
白噪声:在所有频率出能量相等的噪声被称为白噪声
命名源于光,因为所有频率的可见光的均匀混合便是白色
4.3 布朗噪声
布朗噪声:其中各个值是前一个值域一个随机“步长”的和
命名源于布朗运动,颗粒在任意时间点的位置是所有以前步长的和
布朗噪声的功率谱斜率是-2(第9章)
l
o
g
P
=
k
−
2
l
o
g
f
log P = k - 2logf
logP=k−2logf
P是功率,f是频率,k是线的截距
P
=
k
/
f
2
P = k/f^{2}
P=k/f2
布朗噪声也称红噪,因为白噪,让可见光的功率正比于 1 / f 2 1/f^{2} 1/f2时,大部分功率会位于功率谱的低频段,也就是光谱的红色部分
4.4 粉噪
P
=
k
/
f
β
P = k/f^{\beta}
P=k/fβ其中
β
\beta
β介于0和2之间称为粉噪
class PinkNoise(_Noise):
def _init_(self, amp=1.0, beta=1.0):
self.amp = amp
self.beta = beta
def make_wave(self, duration=1, start=0, framerate=11025):
signal = UncorrelatedUniformNoise()
wave = signal.make_wave(duration, start, framerate)
spectrum = wave.make_spectrum()
specturm.pink_filter(beta=self.beta)
wave2 = spectrum.make_wave()#将过滤好的频谱转换回一个波形
wave2.unbias()#居中
wave2.normalize(self.amp)#归一化
return wave2
def pink_filter(self, beta=1.0):
denom = self.fs ** (beta/2.0)#这里是对振幅操作所以是β/2,平方后是功率
denom[0] = 1
self.hs /= denom
4.5 高斯噪声
这才是人们常说的“白噪声”
不相关高斯(UG)噪声,UU噪声的频谱也是UG噪声
实际上,根据中心极限定理,任何不相关噪声的频谱大体上都是高斯性的,只要其分布的均值和标准差为有限制,且样本的数量很大。
np.random.normal返回Numpy数组,其值源于高斯分布
class UncorrelatedGaussianNoise(_Noise):
def evaluate(self, ts):
ys = np.random.normal(0, self.amp, len(ts))#均值0,标准差self.amp
return ys
signal = thinkdsp.UncorrelatedGaussianNoise()
wave = signal.make_wave(duration=0.5, framerate=11025)
spectrum = wave.make_spectrum()
#“概率图”测试分布是否为高斯分布的图形化方法
thinkstats2.NormalProbabilityPlot(spectrum.real)
thinkstats2.NormalProbabilityPlot(spectrum.imag)
UG噪声有趣的属性:频谱的实数和虚数部分是互补相关的高斯值。