通過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
#============================================================

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