无线间断点信号频谱
01 带有间断点信号频谱
一、前言
今天想到一个问题, 这里有两个都带有无穷多个间断点的信号。 它们都位于 0,1 之间。 第一个信号是从 0 开始往1前进, 每前进剩余路程的一半,幅值降低一半。 第二个信号是从 0 往 1 前进, 每次都前进剩余路程的一半。 在前进的路程中出现一个宽度为路程长度一半的矩形脉冲信号。 根据傅里叶变换, 这两个信号都不满足 Dirichlet 条件。 那么他们傅里叶变换是什么呢?
▲ 图1.1.1 第一种间断点函数
▲ 图1.1.2 第二种间断点信号
from headm import *
t = linspace(-.25, 1.25, 100000)
ft = t*0
def G(t, startn, endn):
return heaviside(t-startn,0.5)-heaviside(t-endn,0.5)
def Gt(t, center, width):
startn = center-width/2
endn = startn + width
return heaviside(t-startn,0.5)-heaviside(t-endn,0.5)
'''
for n in range(100):
ft = ft + 0.5**n*(heaviside(t-1+0.5**n,0)-heaviside(t-1+0.5**(n+1),0))
'''
'''
for n in range(100):
startt = 1-(1/2)**n
endt = 1-(1/2)**(n+1)
centert = (endt+startt)/2
lent = endt-startt
ft = ft + Gt(t, centert, lent/2)
'''
for n in range(100):
startt = 1-3*2**-(n+2)
endt = 1-2**-(n+1)
ft = ft + G(t, startt, endt)
plt.plot(t, ft, lw=2)
plt.xlabel("t")
plt.ylabel("f(t)")
plt.grid(True)
plt.grid(False)
plt.tight_layout()
plt.show()
二、信号1频谱
1、频谱推导
首先求取第一个型号的频谱。 这是它的数学表达式, 对于级数中每一项, 它都表示一个矩形脉冲, 高度为 2 的 负 n 次方, 起始点为 1 减去 2 的负 n 次方, 终点为 1 减去 2 的负 n 加 1 次方。 宽度为 2 的 负 n 加 1 次方。 写出该脉冲信号的频谱。 请注意, 该信号的中心应该位于 1 减去3 倍的 2 的 负n 减1次方。
▲ 图1.2.1 级数每一项对应的傅里叶变换
对于原信号的频谱, 就是需要将级数每一项的频谱都加起来, 这样便得到信号的频谱了。
下面是整理后的频谱公式:
▲ 图1.2.2 信号的傅里叶级数分解公式
▲ 图2.2 第一个型号的幅度谱
2、验证公式
这是最终推导出来的信号频谱公式, 这也是一个级数。 下面通过离散傅里叶变换来验证一下这个公式。 这是通过 Python 编程, 取正负 10000 之间的频频, 采用 10 万个频谱数据点,进行反变换。 计算频谱级数取 100 级。 这是计算出来的信号波形。 可以看到它与给定的信号是一致的。 在 0 点有一个过冲, 其余其它间断点都有过冲。 据此,不仅验证了这个公式的有效性, 而且还可以大致推断出该公式应该是收敛的。
▲ 图1.2.3 第一个信号IFFT的结果
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2023-04-10
#
# Note:
#============================================================
from headm import *
o = linspace(-10000, 10000, 100000)
os = (max(o)-min(o))/(len(o)-1)
t1 = 2*pi/os
o1 = max(o)-min(o)
ts = 2*pi/o1
tdim = linspace(-t1/2,t1/2, len(o))
#------------------------------------------------------------
N = 100
Fo = 0*o
for n in range(N):
Fo = Fo + 2**(-2*n-1)*sinc(2**(-n-2)*o/pi)*exp(-1j*o*(1-3/4*2**(-n)))
ft = abs(fft.ifft(Fo))
ft = fft.fftshift(ft)/ts
c = len(o)//2
l = len(o)//20
st = c-l//4
ed = c+l+1*3//4
plt.plot(tdim[st:ed], ft[st:ed], lw=2)
plt.xlabel("t")
plt.ylabel("f(t)")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
三、信号2频谱
1、频谱推导
对于第二个信号, 它表述成无穷级数的形式, 其中每一项信号 对应的高度都是1, 只是他们的宽度和位置不同。 这里给出了信号所在的区域的起始位置和其中脉冲的起始和结束位置。 每一个 脉冲的频谱对应的sinc 函数。将它们叠加起来形成整个信号的频谱。
▲ 图1.3.1 单个脉冲的频谱推导
下面是推导之后的信号波形:
▲ 第二个信号的幅度谱
2、验证公式
为了验证这个公式的正确性, 依然通过Python编程, 使用离散傅里叶反变换获得它对应的波形。 取 正负 10000之内的频谱, 采样 10 万个数据点, 进行傅里叶反变换最终得到信号的是不波形, 这个结果初步验证了公式的正确性。 关于这个信号误差的收敛性,以后再进行仿真验证。 左边是原始信号波形, 右边是利用有限频谱合成的信号波形。
▲ 图1.3.2 使用有限带宽获得信号的近似波形
from headm import *
o = linspace(-10000, 10000, 100000)
os = (max(o)-min(o))/(len(o)-1)
t1 = 2*pi/os
o1 = max(o)-min(o)
ts = 2*pi/o1
tdim = linspace(-t1/2,t1/2, len(o))
N = 100
Fo = 0*o
for n in range(N):
Fo = Fo + 2**-(n+2)*sinc(2**-(n+3)*o/pi)*exp(-1j*o*(1-3*2**-(n+2)))
ft = abs(fft.ifft(Fo))
ft = fft.fftshift(ft)/ts
c = len(o)//2
l = len(o)//20
st = c-l//4
ed = c+l+1*3//4
plt.plot(tdim[st:ed], ft[st:ed], lw=2)
plt.xlabel("t")
plt.ylabel("f(t)")
plt.grid(True)
plt.tight_layout()
plt.show()
※ 总 结 ※
本文对于两个具有无线间断点信号的频谱进行了推导, 它们都是无限级数形式, 并使用 离散傅里叶变换进行数值求解, 通过仿真波形验证了频谱公式的正确性。 关于它们频谱的收敛性, 以后再进行讨论。
▲ 图2.1 信号波形及其频谱
from headm import *
o = linspace(-10000, 10000, 100000)
os = (max(o)-min(o))/(len(o)-1)
t1 = 2*pi/os
o1 = max(o)-min(o)
ts = 2*pi/o1
tdim = linspace(-t1/2,t1/2, len(o))
#------------------------------------------------------------
N = 100
Fo = 0*o
for n in range(N):
Fo = Fo + 2**(-2*n-1)*sinc(2**(-n-2)*o/pi)*exp(-1j*o*(1-3/4*2**(-n)))
# Fo = Fo + 2**-(n+2)*sinc(2**-(n+3)*o/pi)*exp(-1j*o*(1-3*2**-(n+2)))
#------------------------------------------------------------
Foa = abs(Fo)
c = len(o)//2
l = len(o)//20
st = c-l
ed = c+l
plt.plot(o[st:ed], Foa[st:ed], lw=3)
plt.xlabel("Omega")
plt.ylabel("abs(Fo)")
plt.grid(True)
plt.tight_layout()
plt.show()
● 相关图表链接: