为什么信号被削波时谐波分量只有在一定电平之后才会出现?

信息处理 频谱 量化 震级 非线性 非谐波
2022-02-21 18:25:57

我最近观察到这种现象,当信号被削波时,谐波仅在一定水平后才开始出现。

下面给出了重现该效果的 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)
1个回答

这是一个众所周知的现象吗?

是的当然。只要您的削波点低于时域中的最大幅度,您就会看到谐波。后者是谐波分量之间的相对相位的函数。在您的情况下,最大幅度确实是 2.5(加上任何噪声添加)。

如果您更改相位,您将获得不同的剪辑点。例如,如果您使用余弦而不是正弦,您将获得 3.0 的剪辑点