# 二元加法干涉仪仿真
![]()
# 点源推导输出功率
假设我们生活在一维空间,即一张纸上;射电源为点源,且离观测者足够远,到达观测者的电磁波近似于平面波。两天线固定指向,当射电源偏离天线指向的角度为θ 时,两路电磁波入射到天线上,走过的几何长度之差:ΔL=bsinθ
两路电磁波时延之差:ΔL=cΔL=cbsinθ
入射电磁波可以设为平面正弦波,两路同轴线长度、低噪放等配置一致,则有
天线 A 感应到的电压:VA=V0sin[2π(λx−ft)]=V0sin(kx−ωt)
天线 A 感应到电压的复数形式:VA=V0ei(kx−ωt)
天线 B 感应到电压的复数形式:VB=V0ei[kx−ω(t−τ)]
经过合路器相加,有总输出电压:
A=VA+VB=V0ei(kx−ωt)(1+eiωτ)
输出总功率:
P=AA∗=V02(1+eiωτ)(1+e−iωτ)=2A02[1+cos(ωτ)]=2A02[1+cos(2πfbsinθ/c)](干涉仪公式1)
由于天体在天空中是运动的,因此固定天线指向时,θ 是随时间均匀变化的,有θ=θ˙t,一天转 360°,相当于每秒转 360°/(24*3600)=0.00417°/s,即θ˙=0.00417°/s ,用弧度表示即有θ˙=7.27×10−5rad/s。以天体恰好运行到天线指向处的时间为开始时间(t=0),则有cos(2πfbsinθ/c)=cos(2πfbsin(7.27×10−5t)/c),可以看出,接收机输出的总功率会随时间而上下震荡,这种随震荡被称为条纹(类比于光学条纹干涉实验中明暗相间的条纹,这里是时域上的条纹,考虑到θ=θ˙t,ΔL=bsinθ,实际上是ΔL 上的条纹,也相当于空间上的条纹分布了)。
不考虑底噪2A02 项(即扣除),分别用长度为 3m、9m、15m 的基线,在 1425MHz 处观测射电源时,在射电源运行到天线指向处的前后半小时内,输出总功率随时间的变化图如下:
![]()
# 考虑源的角直径对输出功率的影响
实际上的射电源不是电源,而是有一定亮度分布,夸张来讲是类似于太阳和月亮这种面源。考虑面源的角直径为α 且亮度是均匀分布的,把这个因素加入到干涉仪公式 1 则有
P=AA∗=2A02α2[1+sinc(πfαb/c)cos(2πfbsinθ/c)](干涉仪公式2)
其中sinc(πfαb/c) 描述了射电源大小,cos(2πfbsinθ/c) 描述了条纹变化率
注:本文的 sinc (x) 定义为 sinx/x,下文都将使用这种定义(代码中可能例外,可能使用 sinc (x)=sin (pi x)/(pi x) 这种定义)
太阳的角直径约为 0.5°,换算为弧度即有α=0.5×180π≈0.00873 rad。不考虑底噪2A02α2 项(即扣除),分别用长度为 3m、9m、15m 的基线,在 1425MHz 处观测太阳,在射电源运行到天线指向处的前后半小时内,输出总功率随时间的变化图如下:
![]()
# 考虑天线方向图对输出功率的影响
类似于人的耳朵,天线对不同方向的响应(或者说灵敏度)不一样,相当于对不同方向会赋予不同的权重。假设天线对不同方向的权重呈高斯分布,即高斯波束。
(此处可略过,如果感觉复杂的话)对于面天线而言,当用口径为D 的面天线观测波长为λ 的电磁波时,其半功率波束宽度近似为HPBW=70λ/D,增益近似为G=10log10(D2/λ2),即有D/λ=10(G/10),HPBW=70/10(G/10)。对于在 1425MHz 有 15dBi 增益的八木天线(换算为线性增益为 31.62),可以得到其半功率波束宽度约为70/31.6=12.45°。即设置高斯函数时,其在12.45°/2=6.225°(半功率波束宽度的一半)处的权重相对于 0° 处的权重已经衰减了约一半,对应的弧度为 0.109 rad。
对于高斯函数而言,可以将标准差设置为 0.109,即可保证在 0.109 处衰减约一半,即有
W(θ)=e−2σ(θ−μ)2=e−2∗0.109θ2,如下图所示
![]()
把W(θ) 加入到干涉条纹公式 2,可以得到
P=AA∗=2A02α2e−2∗0.109θ2[1+sinc(πfαb/c)cos(2πfbsinθ/c)](干涉仪公式3)
不考虑底噪2A02α2 项(即扣除),分别用长度为 3m、9m、15m 的基线,在 1425MHz 处观测太阳,在射电源运行到天线指向处的前后半小时内,输出总功率随时间的变化图如下:
![]()
# 二元加法干涉仪仿真代码
| import numpy as np |
| import matplotlib.pyplot as plt |
| |
| |
| plt.rcParams['font.sans-serif'] = ['SimHei'] |
| plt.rcParams['axes.unicode_minus'] = False |
| |
| |
| simulator = 3 |
| |
| |
| b_list = [3,9,15] |
| |
| |
| t = np.linspace(-1800, 1800, 1000) |
| |
| |
| f = 1425e6 |
| b = 3 |
| c = 299792458 |
| alpha = 0.00873 |
| |
| |
| |
| plt.figure(figsize=(10, 8)) |
| |
| for b in b_list: |
| |
| rate_term = np.cos(2 * np.pi * f * b * np.sin(7.27e-5 * t) / c) |
| |
| def sinc(x): |
| return np.where(x == 0, 1, np.sin(x) / x) |
| size_term = sinc(np.pi * f * alpha * b / c) |
| |
| def gaussian(x, mean, stddev): |
| return np.exp(-0.5 * ((x - mean) / stddev) ** 2) |
| gain_term = gaussian(7.27e-5 * t,0,0.109) |
| if str(simulator) == '1': |
| |
| y = rate_term |
| elif str(simulator) == '2': |
| |
| y = rate_term*size_term |
| elif str(simulator) == '3': |
| y = rate_term*size_term*gain_term |
| plt.plot(t, y,label=f'b={b} m') |
| |
| plt.title('不同基线长度下的条纹率',fontsize=20) |
| plt.xlabel('时间 (s)',fontsize=18) |
| plt.ylabel('扣除底噪的总功率',fontsize=18) |
| plt.xticks(fontsize=15) |
| plt.yticks(fontsize=15) |
| plt.legend(fontsize=15) |
| plt.xlim(-1800, 1800) |
| plt.ylim(-1.5, 1.5) |
| |
| plt.show() |
# 二元干涉仪综合孔径成像
# 两天线接收到的总电压值
![]()
两天线配置一致,射电源的强度分布为I(θ),天线对不同方向的响应函数为W(θ),再考虑不同方向的电磁波入射到两天线上会有几何时延差导致的相位差,导致的幅度变化可归为ei2πfcbsinθ 项,则天线指向射电源中心角度θc 时,输出功率为
P(θc)=[W(θ1)∗I(θ1)∗ei2πfcbsinθ1+W(θ2)∗I(θ2)∗ei2πfcbsinθ2+W(θ3)∗I(θ3)∗ei2πfcbsinθ3+⋯+W(θn)∗I(θn)ei2πfcbsinθn]∗Δθ==∫θc−πθc+πW(θ)I(θ)ei2πfcbsinθdθ(干涉仪公式4)
# 宽天线波束观测均匀面源得到总电压值表达式
设射电源为理想的强度均匀分布的面源,天线指向射电源的中心位置,此时角度为θc,其角直径为α,当∣θ−θc∣≤α/2 时,则有I(θ)=I0,当∣θ−θc∣>α/2 时,有I(θ)=0。
如果天线的增益不高,相当于W(θ) 在θc 附近足够平坦,即当∣θ−θc∣≤α/2 时,可以认为W(θ) 为常数,即可认为是A,带入干涉仪公式 4 可以推导出
注:设置新变量为θ′=θ−θc
P(θc)=∫θc−α/2θc+α/2W(θ)I(θ)ei2πfcbsinθdθ=∫−α/2α/2W(θ′)I(θ′)ei2πfcbsin(θ′+θc)dθ′=AI0∫−α/2α/2ei2πfcbsin(θ′+θc)dθ′(干涉仪公式5)
在−α/2 到α/2 的范围内(太阳的角直径α 仅为 0.5°),θ′ 足够小,利用sin(θ′+θc)=sinθ′cosθc+cosθ′sinθc=θ′cosθc+sinθc,则有
P(θc)=AI0ei2πfcbsinθc∫−α/2α/2ei2πfcbθ′cosθcdθ′=AI0αei2πfcbsinθcπfcbαcosθcsin(πfcbαcosθc)=AI0αei2πfcbsinθcsinc(πfcbαcosθc)(干涉仪公式6)
如果射电源运行到最高处,即在中天位置附近, 即θc 足够小,cos(θc) 此时接近 1,于是不考虑底噪项时,干涉仪公式 6 等价于公式 3(只取复数的实部)。也可以看出bcosθc 是基线长度b 在垂直于射电源指向方向的投影,是实际上的等效基线长度。
# 射电源强度分布和天线输出电压是一对傅里叶变化
由干涉仪公式 5 也可见(仅认为W(θ) 为常数A,强度分布I(θ) 不认为是常数):
P(θc)=A∫−α/2α/2I(θ′)ei2πfcbsin(θ′+θc)dθ′
由于射电源角直径非常小,因此sin(θ′+θc)=θ′cosθc+sinθc
P(θc)=A∫−α/2α/2I(θ′)ei2πfcb(θ′cosθc+sinθc)dθ′=Aei2πfcbsinθc∫−α/2α/2I(θ′)ei2πfcbθ′cosθcdθ′
最后是为了获得强度的分布,而不是相位分布,因此把P(θc)e−i2πfcbsinθc 记为P′(θc),显然P(θc) 和P′(θc) 的绝对值是一样的(而且我们已知b 和θc,也可以直接把这个相位项消除),即有:
P′(θc)=P(θc)e−i2πfcbsinθc=∫−α/2α/2I(θ′)ei2πfcbθ′cosθcdθ′
其中bcos(θc) 为基线相对于射电源方向的投影,因此可将fcbcos(θc)=λbcos(θc) 记为bλ,则有:
P′(bλ)=A∫−α/2α/2I(θ′)ei2πbλθ′dθ′(干涉仪公式8)
可见干涉仪输出的电压值E 和射电源的强度分布I 是一对傅里叶变化,干涉仪公式 8 的逆变换为:
I(θ′)=∫−∞∞P′(bλ)e−i2πθ′bλdbλ(干涉仪公式9)
因此我们可以利用地球自转(θc 变动)或者主动改变基线长度(b 变动),从而改变bλ,测量在不同bλ 下的输出电压,然后进行傅里叶级数叠加,即可得到射电源的强度分布,例如利用长度为 3m、6m、9m... 24m 一系列基线在 1425MHz(21cm)每天测量一次中天的射电源,可以得到
I(θc)=(P3mei2π∗3θ′/0.21+P6mei2π∗6θ′/0.21+P9mei2π∗9θ′/0.21+...+P24mei2π∗24θ′/0.21)∗Δbλ=(P3mei2π∗3θ′/0.21+P6mei2π∗6θ′/0.21+P9mei2π∗9θ′/0.21+...+P24mei2π∗24θ′/0.21)∗3/0.21
# 综合孔径实际观测考量
干涉仪公式 8 和公式 9 认为天线的方向图在指向射电源时是平坦的,即对输出功率毫无影响,然而如果利用地球自转而不跟踪射电源的话,射电源运行到不同方位时,天线对电磁波的响应权重肯定也变了,因此需要了解天线的详细方向图才能进行没法直接测量方向图。
然而业余观测时往往不知道方向图,因此放弃靠地球自转来进行综合孔径成像。可以固定天线一直指向射电源中天的位置,只观测中天的强度,由于天线方向图对此方向的响应权重肯定是不变的,因而无需考虑天线方向图的影响,视为常数A,在此情况下可利用干涉仪公式 8 和公式 9。
干涉仪的最小分辨角约为θmin=bλ,即和观测波长成正比,和基线长度成反比。太阳的角直径为 0.5°,也就是 0.00873 rad,为使得二元干涉仪能够观测太阳,一系列基线长度之间的间距不能超过Δbλ=λ/0.00873=115λ,比如在 1420MHz(21cm)观测,则间距不能超过 25m。我们把这个间距设为 3m,利用长度为 3m、6m、9m... 24m(手动改变基线长度)一系列基线每天测量一次中天的射电源强度,然后得到
I(θc)=(P3mei2π∗3θ′/0.21+P6mei2π∗6θ′/0.21+P9mei2π∗9θ′/0.21+...+P24mei2π∗24θ′/0.21)∗3/0.21
取其实部,即可得到太阳的一维强度分布,也就是所谓的综合孔径合成,在此未使用 uv 覆盖的概念,实际上是等价的。
当天线指向射电源中天位置进行观测时,干涉仪公式 6 中的sinc(πfcbαcosθc)=sinc(πfcbα) 即在理论上描述了使用不同长度基线观测到的幅度变化,可以此作为权重,编写代码如下,对在 1425MHz,用长度为 3m、6m、9m... 24m 长度的基线对太阳(角直径为 0.00873 rad)进行综合孔径结果进行仿真。结果如下图所示,可见其半功率衰减角为 0.00353*2=0.00706 rad,和理论的太阳大小相近。
![]()
为了进一步验证理论和程序的可靠性,尝试仿真 0.001 rad 角直径的射电源,仍然在 1425MHz 进行观测,一系列基线长度之间的间距不能超过Δbλ=λ/0.0001=1000λ,即 210m,我们把这个间距设为 12m,利用长度为 12m、24m、36m... 210m(手动改变基线长度)一系列基线每天测量一次中天的射电源强度,然后得到的结果如下图,可见其半功率衰减角为 0.000415*2=0.000830 rad,和理论的射电源大小相近
![]()
# 综合孔径仿真代码
| import numpy as np |
| import matplotlib.pyplot as plt |
| |
| |
| plt.rcParams['font.sans-serif'] = ['SimHei'] |
| plt.rcParams['axes.unicode_minus'] = False |
| |
| |
| alpha = 0.00873 |
| |
| f = 1425e6 |
| c=3e8 |
| lam = c/f |
| |
| |
| b_lambda_list = np.arange(3, 24, 3)/lam |
| |
| |
| |
| weights = [] |
| |
| for b_lambda in b_lambda_list: |
| weights.append(np.sinc(b_lambda * alpha)) |
| |
| weights = np.array(weights) / np.max(weights) |
| |
| |
| theta_prime = np.linspace(-0.005, 0.005, 1000) |
| |
| |
| result = np.zeros_like(theta_prime, dtype=complex) |
| for i, b_lambda in enumerate(b_lambda_list): |
| result += weights[i] * np.exp(1j * 2 * np.pi * b_lambda * theta_prime) |
| |
| result *= b_lambda_list[1]-b_lambda_list[0] |
| result = result/max(result) |
| |
| |
| plt.figure(figsize=(12, 8)) |
| |
| |
| plt.subplot(2, 1, 1) |
| |
| plt.plot(b_lambda_list*lam,weights, marker='.',markersize=10, label='强度的角分布') |
| plt.xticks(fontsize=15) |
| plt.yticks(fontsize=15) |
| plt.xlabel('基线长度 (m)',fontsize=18) |
| plt.ylabel('归一化强度值',fontsize=18) |
| plt.legend(fontsize=15) |
| plt.title(f'各长度基线观测射电源输出功率的变化',fontsize=20) |
| plt.grid() |
| |
| |
| plt.subplot(2, 1, 2) |
| plt.plot(theta_prime, np.real(result), label='强度的角分布') |
| |
| |
| |
| |
| plt.title(f'{alpha} rad 角直径的射电源',fontsize=20) |
| plt.xlabel('角度 (rad)',fontsize=18) |
| plt.ylabel('归一化强度值',fontsize=18) |
| plt.xticks(fontsize=15) |
| plt.yticks(fontsize=15) |
| plt.legend(fontsize=15) |
| plt.xlim(-alpha*3, alpha*3) |
| |
| |
| |
| target_value = 0.5 |
| index = (np.abs(np.real(result) - target_value)).argmin() |
| closest_value = np.real(result)[index] |
| corresponding_theta = theta_prime[index] |
| |
| plt.text(corresponding_theta, 0.5, f'({corresponding_theta:.6f},0.5)',fontsize=20) |
| plt.scatter(corresponding_theta, 0.5,color='r') |
| |
| |
| plt.grid() |
| plt.legend(fontsize=15) |
| |
| plt.tight_layout() |
| plt.show() |