通过FFT来计算螺旋线的匝数

手边有两个螺旋线,它们是射频天线。下面使用图像处理的方法来获得它们对应的匝数。

▲ 两款天线对比

▲ 两款天线对比


01基本算法原理

具体处理步骤:

1. 截取螺旋线的图片:

截取螺旋线的图频并旋转的水平方向。

▲ 截取螺旋线图片,并将它旋转到水平方向

▲ 截取螺旋线图片,并将它旋转到水平方向

2. 将图片进行垂直投影

读取图片信息并进行垂直灰度投影。图片的形状为:(58,113,3)
▲ 图片垂直灰度投影

▲ 图片垂直灰度投影

from headm import *
imageid = 6
imagefile = tspgetdopfile(imageid)
printf(imagefile)
imdata = plt.imread(imagefile)
printf(shape(imdata))
imgray = dot(imdata, [.299, .587, .114])
imprj = mean(imgray, 0)
plt.plot(imprj)
plt.xlabel('Columns')
plt.ylabel('Projection')
plt.grid(True)
plt.show()


(3)对投影进行DFT,获得基本周期

下面绘制出了投影曲线的FFT的幅度谱,其中,将直流分量X[0]没有去除。
▲ 投影的FFT的幅值

▲ 投影的FFT的幅值

其中峰值位置是26。

fftabs = list(abs(fft.fft(imprj)))
maxindex = fftabs.index(max(fftabs[1:int(len(fftabs)/2)]))
printf(maxindex)
plt.plot(fftabs[1:])
plt.grid(True)
plt.xlabel('k')
plt.ylabel('Abs(X[k])')
plt.show()

此时,对应的线圈的匝数为26。这与实际人工数出的匝数是相同的。


02其它测数据

1.RF433MHz天线

下面是它对应的图片:
▲ 433MHz螺旋天线图

▲ 433MHz螺旋天线图

对应的幅度谱如下,其中第一个峰值出现在k=26,对应的线圈匝数为26.
▲ 垂直投影以及对应的FFT幅度谱

▲ 垂直投影以及对应的FFT幅度谱

2. 355MHz绝缘金属线天线

天线的图片为:
▲ 绝缘天线图片

▲ 绝缘天线图片

计算结果,频谱峰值为9。实际线圈的匝数为14。这说明对于黑色线圈,由于对比度不高,造成实际匝数与计算值出现了较大的误差。
▲ 垂直图片灰度投影以及对应的FFT幅度谱

▲ 垂直图片灰度投影以及对应的FFT幅度谱

3. FM天线图片

▲ FM天线图片

▲ FM天线图片

处理结果如下,其中峰值出现在71。实际手工计算得到的匝数为71。
▲ 图片的垂直灰度投影以及对应的频谱幅度谱

▲ 图片的垂直灰度投影以及对应的频谱幅度谱


03结论

使用离散傅里叶变换(DFT)来计算线圈图片绘图垂直投影的幅度谱,通过确定谐波峰值的位置,便可以计算机上线圈的匝数。

这个方法的对于线圈颜色为黑色的线圈,由于图片中对比度不够,呈现的投影对应的频谱峰值出现比较大的偏差。

在上述实验过程中,对于线圈图片的截取以及旋转水平的预处理是通过手工操作的方式。该方法还是有待于进一步的改进,使得图片的预处理能够自动完成。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2020-05-25
#
# Note:
#============================================================
from headm import *
imageid = 7
imagefile = tspgetdopfile(imageid)
printf(imagefile)
imdata = plt.imread(imagefile)
printf(shape(imdata))
imgray = dot(imdata, [.299, .587, .114])
imprj = mean(imgray, 0)
fftabs = list(abs(fft.fft(imprj)))
maxindex = fftabs.index(max(fftabs[1:int(len(fftabs)/2)]))
printf(maxindex)
plt.subplot(2,1,1)
plt.plot(imprj)
plt.xlabel('Columns')
plt.ylabel('Projection')
plt.grid(True)
plt.subplot(2,1,2)
plt.plot(fftabs[1:])
plt.grid(True)
plt.xlabel('k')
plt.ylabel('Abs(X[k])')
plt.show()
#------------------------------------------------------------
'''
plt.plot(imprj)
plt.xlabel('Columns')
plt.ylabel('Projection')
plt.grid(True)
plt.show()
printf('\a')
'''
#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章