Matlab - 如何进行近场/远场变换
Matlab - how to do a near field / far field transformation
我想用 MATLAB 做一个近场-远场变换。我正在使用软件工具 Feko 为我的贴片天线建模并获得 near field data。有了这些数据,我可以显示一个平面,该平面显示我的微带天线(在 z = 5mm 处)的近电场。
目前,我只放 Re(Ex)+i.Im(Ex)、Re(Ey)+i.Im(Ey) 和 Re(Ez)+i.Im (Ez) 在同一个矩阵中。
我知道我应该使用 fft 或类似 "plane wave spectrum" 但我不知道如何使用。
最后,我想展示一个显示远场的平面(例如z = 500mm)。
欢迎任何帮助我的想法!
谢谢
这是code我所做的,以及解释它的评论。
clear all
%% GET NEAR-FIELD DATAS FROM FEKO AND DELETE COMMENTS
[ficname,pathname] = uigetfile('*.efe','fichier ''.efe'' a convertir ?');
nomfic = [pathname ficname];
i0 = find(ficname=='.');
system(['sed -e "/^#/d;/^*/d" ',' "',nomfic,'"| tr -s " " " " > result.txt']);
A = load('result.txt');
%% DISPLAY THE E NEAR-FIELD
X = A(:,1);
Y = A(:,2);
Z = A(:,3);
aux = A(:,4:9);
Ex = sqrt((aux(:,1).^2 + aux(:,2).^2));
Ey = sqrt((aux(:,3).^2 + aux(:,4).^2));
%%Ez = sqrt((aux(:,5).^2 + aux(:,6).^2));
Etot = sqrt(Ex.^2+Ey.^2);
%% Grid interpolation (meshgrid)
patchd = 28 .* 0.001;
patchw = 43 .* 0.001;
pas = 0.5 .* 0.001;
xmin = -patchw/2;
xmax = patchw/2;
pasx = pas;
ymin = -patchd/2;
ymax = patchd/2;
pasy = pas;
[xq,yq] = meshgrid(xmin:pasx:xmax,ymin:pasy:ymax);
EInterp = griddata(X,Y,Etot,xq,yq);
figure(1);
surf(xq,yq,EInterp);
caxis([1 90]);
view(0,90);
%% TRANSFORMATION NEAR-FIELD FAR-FIELD
%% This is where I need to do an FFT on my near-field datas
Ex_im = aux(:,1)+i*aux(:,2);
Ey_im = aux(:,3)+i*aux(:,4);
Ez_im = aux(:,5)+i*aux(:,6);
N = 1024;
E_im = [Ex_im Ey_im];
%%C = fftshift(abs(fft2(E_im,N)));
%%C = fftshift(fft(fftshift(E_im,N)));
%% DISPLAY THE E FAR-FIELD
%% I will see later
%%surf(20*log10(C));
这个问题有两个部分。第一个是 "how do I obtain the far fields given the near fields?" 第二个是 "how do I implement that in MATLAB?"
很多时候 matlab 有一个内置函数来执行像这样的专门过程,所以答案可以是 'use function xyz' 但在这种情况下我不知道有一个。
因为这不是微不足道的,我建议花点时间研究一下。首先搜索 MATLAB 文档,看看它们是否为您提供了功能。如果失败,请查看其他人是否已经实施 - Mathworks file exchange often has third-party tools that do well-defined but complex tasks like this, for instance here 是一些结果。
如果还没有实现到您满意的程度,或者您有自己编写代码的需求(商业应用、作业问题等),那么您将不得不自己实现。要从第一原理开始,您需要一本电磁学教科书 - 我喜欢 Collin, Field Theory of Guided Waves - but the derivations have already been done so you will probably find it more useful to start in the middle somewhere with something like this.
处理建模方面的问题。然后,实现是关于使用 MATLAB 来实现您定义的过程。如果您在该部分需要帮助,请确保包含您尝试构建的算法的详细信息以及到目前为止您已成功完成的工作。
实现平面波谱法只需要两个场分量。
我假设您要使用 z=5mm 高度处的频域中的 Ex 和 Ey 来计算 z'=500mm 处的 Ex、Ey 和 Ez。
计算kx、ky和kz:
kx 范围从 -pi/X 到 pi/X,ky 从 -pi/Y 到 pi/Y。 X 和 Y 是平面的长度。 kz 可以使用以下等式计算。
计算 z=5mm 处的 FEx 和 FEy:
这可以使用 Matlab 轻松完成。
FEx=ifftshift(ifft2(Ex));
FEy=ifftshift(ifft2(Ey));
计算 z=5mm 处的 FEz:
在 z'=500mm 处计算 FEx、FEy、FEz:
FEx_500=FEx.*exp(-1i*kz*(z'-z));
FEy_500=FEy.*exp(-1i*kz*(z'-z));
FEz_500=FEz.*exp(-1i*kz*(z'-z));
在 z'=500mm 处计算 Ex、Ey、Ez:
Ex_500=fft2(fftshift(FEx_500));
Ey_500=fft2(fftshift(FEy_500));
Ez_500=fft2(fftshift(FEz_500));
有一些您可能感兴趣的参考资料:
EMC 应用的平面近场到远场转换研究
平面波谱理论应用于电磁兼容性研究的近场测量
我想用 MATLAB 做一个近场-远场变换。我正在使用软件工具 Feko 为我的贴片天线建模并获得 near field data。有了这些数据,我可以显示一个平面,该平面显示我的微带天线(在 z = 5mm 处)的近电场。
目前,我只放 Re(Ex)+i.Im(Ex)、Re(Ey)+i.Im(Ey) 和 Re(Ez)+i.Im (Ez) 在同一个矩阵中。
我知道我应该使用 fft 或类似 "plane wave spectrum" 但我不知道如何使用。
最后,我想展示一个显示远场的平面(例如z = 500mm)。
欢迎任何帮助我的想法!
谢谢
这是code我所做的,以及解释它的评论。
clear all
%% GET NEAR-FIELD DATAS FROM FEKO AND DELETE COMMENTS
[ficname,pathname] = uigetfile('*.efe','fichier ''.efe'' a convertir ?');
nomfic = [pathname ficname];
i0 = find(ficname=='.');
system(['sed -e "/^#/d;/^*/d" ',' "',nomfic,'"| tr -s " " " " > result.txt']);
A = load('result.txt');
%% DISPLAY THE E NEAR-FIELD
X = A(:,1);
Y = A(:,2);
Z = A(:,3);
aux = A(:,4:9);
Ex = sqrt((aux(:,1).^2 + aux(:,2).^2));
Ey = sqrt((aux(:,3).^2 + aux(:,4).^2));
%%Ez = sqrt((aux(:,5).^2 + aux(:,6).^2));
Etot = sqrt(Ex.^2+Ey.^2);
%% Grid interpolation (meshgrid)
patchd = 28 .* 0.001;
patchw = 43 .* 0.001;
pas = 0.5 .* 0.001;
xmin = -patchw/2;
xmax = patchw/2;
pasx = pas;
ymin = -patchd/2;
ymax = patchd/2;
pasy = pas;
[xq,yq] = meshgrid(xmin:pasx:xmax,ymin:pasy:ymax);
EInterp = griddata(X,Y,Etot,xq,yq);
figure(1);
surf(xq,yq,EInterp);
caxis([1 90]);
view(0,90);
%% TRANSFORMATION NEAR-FIELD FAR-FIELD
%% This is where I need to do an FFT on my near-field datas
Ex_im = aux(:,1)+i*aux(:,2);
Ey_im = aux(:,3)+i*aux(:,4);
Ez_im = aux(:,5)+i*aux(:,6);
N = 1024;
E_im = [Ex_im Ey_im];
%%C = fftshift(abs(fft2(E_im,N)));
%%C = fftshift(fft(fftshift(E_im,N)));
%% DISPLAY THE E FAR-FIELD
%% I will see later
%%surf(20*log10(C));
这个问题有两个部分。第一个是 "how do I obtain the far fields given the near fields?" 第二个是 "how do I implement that in MATLAB?"
很多时候 matlab 有一个内置函数来执行像这样的专门过程,所以答案可以是 'use function xyz' 但在这种情况下我不知道有一个。
因为这不是微不足道的,我建议花点时间研究一下。首先搜索 MATLAB 文档,看看它们是否为您提供了功能。如果失败,请查看其他人是否已经实施 - Mathworks file exchange often has third-party tools that do well-defined but complex tasks like this, for instance here 是一些结果。
如果还没有实现到您满意的程度,或者您有自己编写代码的需求(商业应用、作业问题等),那么您将不得不自己实现。要从第一原理开始,您需要一本电磁学教科书 - 我喜欢 Collin, Field Theory of Guided Waves - but the derivations have already been done so you will probably find it more useful to start in the middle somewhere with something like this.
处理建模方面的问题。然后,实现是关于使用 MATLAB 来实现您定义的过程。如果您在该部分需要帮助,请确保包含您尝试构建的算法的详细信息以及到目前为止您已成功完成的工作。
实现平面波谱法只需要两个场分量。
我假设您要使用 z=5mm 高度处的频域中的 Ex 和 Ey 来计算 z'=500mm 处的 Ex、Ey 和 Ez。
计算kx、ky和kz:
kx 范围从 -pi/X 到 pi/X,ky 从 -pi/Y 到 pi/Y。 X 和 Y 是平面的长度。 kz 可以使用以下等式计算。
计算 z=5mm 处的 FEx 和 FEy:
这可以使用 Matlab 轻松完成。
FEx=ifftshift(ifft2(Ex)); FEy=ifftshift(ifft2(Ey));
计算 z=5mm 处的 FEz:
在 z'=500mm 处计算 FEx、FEy、FEz:
FEx_500=FEx.*exp(-1i*kz*(z'-z)); FEy_500=FEy.*exp(-1i*kz*(z'-z)); FEz_500=FEz.*exp(-1i*kz*(z'-z));
在 z'=500mm 处计算 Ex、Ey、Ez:
Ex_500=fft2(fftshift(FEx_500)); Ey_500=fft2(fftshift(FEy_500)); Ez_500=fft2(fftshift(FEz_500));
有一些您可能感兴趣的参考资料:
EMC 应用的平面近场到远场转换研究
平面波谱理论应用于电磁兼容性研究的近场测量