我最近观察到这种现象,当信号被削波时,谐波仅在一定水平后才开始出现。
下面给出了重现该效果的 Python 代码。该信号在 30、60 和 90 Hz 处具有 3 个分量。因此,最大可能的峰峰值电压为 3。我在不同的电平上对信号进行了削波并观察了幅度谱,但只有当削波低于 -2.5 和 2.5 时,谐波才开始明显可见。
这是一个众所周知的现象吗?这背后的可能解释是什么?
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from scipy.io import wavfile
labelsize = 12
width = 3.5
height = width / 1.618
lwidth = 0.9
plt.rc('font', family='serif')
plt.rc('text', usetex=True)
plt.rc('xtick', labelsize=labelsize)
plt.rc('ytick', labelsize=labelsize)
plt.rc('axes', labelsize=labelsize)
def MagnitudeSpectrum(data, Fs, clip):
P = 20*np.log10(np.abs(np.fft.rfft(data)))
f = np.linspace(0, Fs/2, len(P))
fig, ax = plt.subplots()
fig.subplots_adjust(left=.20, bottom=.25, right=.96, top=.90)
plt.plot(f, P, color='k', ls='solid', linewidth=lwidth, label='')
plt.xlim(0, 500)
plt.title('Signal Clipped BW '+str(-1*clip)+' and'+str(clip))
plt.xlabel('Frequency [Hz]')
plt.ylabel('Magnitude [dB]')
# plt.show()
fig.set_size_inches(width, height)
fig.savefig('SignalMagSpectro_'+str(clip)+'.png', dpi = 600)
cliplevels = np.arange(2.2, 3.2, 0.1)
for clip in cliplevels:
Fs = 44100.0
t = np.arange(0, 10, 1/Fs)
data = np.sin(2*np.pi*30*t)+np.sin(2*np.pi*60*t)+ np.sin(2*np.pi*90*t) +0.1*np.random.randn(len(t))
data = np.clip(data, -1*clip, clip)
MagnitudeSpectrum(data, Fs, clip)