目录
1. 前言
接着上一篇(IMRR(镜像抑制比)计算和仿真 (1)),我们将做一个简单的matlab仿真,看看仿真结果与上述理论推导结果是否会保持一致。
2. 代码(matlab)
% 改编自:http://www.dsplog.com/2013/01/31/imrr-transmit-iq-gain-phase-imbalance/
clear; close all; clc
debug = 1; % Enable the debug mode to visualize the spectrum, etc.
N = 256; % Simulation data block length
Fsig = 20; % Modulation signal frequency, i.e, the frequency of Complex sinusoid
gammadB_array = [-3:.1:3]; % Q/I amplitude difference in unit of dB
phiDeg_array = [-6:.2:6]; % Q/I phase difference in unit of degree
[~, gammadB_zeroIdx ] = min(abs((gammadB_array-0)));
[~, phiDeg_zeroIdx ] = min(abs((phiDeg_array-0)));
if(debug == 1)
gammadB_array = -3;
phiDeg_array = -6;
end
for (ii = 1:length(gammadB_array))
for (jj = 1:length(phiDeg_array))
gammadB = gammadB_array(ii);
phiDeg = phiDeg_array(jj);
gammaLin = 10^(gammadB/20); % Convert dB to linear domain
phiRad = phiDeg*pi/180; % Convert degree to radian, because sin/cos accept rad as input
alphaLin = gammaLin -1 ;
% transmitted signal
xt = exp(sqrt(-1)*2*pi*Fsig*[0:N-1]/N); % Complex sinusoid
% received signal with IQ imbalance, after quadrature demodulation
xht_re = real(xt) - gammaLin*sin(phiRad)*imag(xt);
xht_im = gammaLin*cos(phiRad/2)*imag(xt);
xht = complex(xht_re,xht_im); % "h" mean hat.
if(debug)
fvtool(xt); title('Transmitter baseband signal spectrum');
fvtool(xht);title('Receiverer baseband signal spectrum');
end
% Take fft() to find the +Fsig(desired signal) and -Fsig(image due to I/Q mismatch) components
yF = fft(xht,N);
y_pfm = yF(Fsig+1);
y_nfm = yF(N-Fsig+1);
est_imrr_lin = (abs(y_pfm)./abs(y_nfm))^2;
theory_imrr_lin = (gammaLin^2 + 1 + 2*gammaLin*cos(phiRad))/(gammaLin^2 + 1 - 2*gammaLin*cos(phiRad));
approx_imrr_lin = 4/(alphaLin^2 + phiRad^2);
est_imrr_dB(ii,jj) = 10*log10(est_imrr_lin);
theory_imrr_dB(ii,jj) = 10*log10(theory_imrr_lin);
approx_imrr_dB(ii,jj) = 10*log10(approx_imrr_lin);
end
end
figure;
plot(gammadB_array,theory_imrr_dB(:,phiDeg_zeroIdx),'bs-'); hold on
plot(gammadB_array,est_imrr_dB(:,phiDeg_zeroIdx),'md-');
plot(gammadB_array,approx_imrr_dB(:,phiDeg_zeroIdx),'gx-');
xlabel('gain imbalance, dB'); ylabel('image rejection, dB'); grid on;
legend('theory','estimated','approx')
title('Image Rejection Ratio with gain imbalance alone');
axis([-3 3 10 50]);
figure;
plot(phiDeg_array,theory_imrr_dB(gammadB_zeroIdx,:),'bs-'); hold on
plot(phiDeg_array,est_imrr_dB(gammadB_zeroIdx,:),'md-');
plot(phiDeg_array,approx_imrr_dB(gammadB_zeroIdx,:),'gx-');
xlabel('phase imbalance, degree'); ylabel('image rejection, dB'); grid on;
legend('theory','estimated','approx')
title('Image Rejection Ratio with phase imbalance alone');
axis([-6 6 10 50]);
figure;
[x,y] = meshgrid(gammadB_array,phiDeg_array);
mesh(x,y,est_imrr_dB); title('IMRR vs {gammadB, phiDeg}');
axis([-3 3 -6 6 10 60]);
3.代码补充说明
本仿真中采取了简单(偷懒)的做法。
N取256是为了方便做FFT分析,这样在Fsig取整数时在频谱中信号分量和镜像分量会正好占一个FFT输出样点(也称bin),不会发生频谱泄露。这样根据FFT变换结果取对应bin的值就可以直接得到信号分量和镜像分量的频域幅度,并进而可以计算得出IMRR。
如果N不是2^k,Fsig也不是设置为整数,那么FFT变换中会出现频谱泄漏,信号和镜像都会扩散到FFT输出的bin上去,这是就不能只取一个bin的值来计算信号和镜像的功率了。读者可以自行设计实验进行验证。
在更一般性的仿真中,有两种方法可以估计信号和镜像的功率。
- 如上一篇(链接)所述,在时域进行滤波分别提取出信号和镜像并分别计算功率
- 经过FFT变换后,取以Fig和-Fig近似对应的bin为中心的一段区间内的bin的总功率分别作为信号和镜像的功率,读者可以自行设计实验进行尝试
代码中还有一个debug开关,将debug设置为1时,只执行某一组(gamma, phi)的设定的仿真(可以修改)并输出频谱图以方便直接确认程序运行是否正常。
4. 仿真结果
运行以上程序可以得到以下输出,可以确认仿真结果与理论计算结果非常吻合。当然这只是一个简单的仿真,有很多因素没有考虑进来,但是从提供定性的参考结果的角度来看是充分可行的。
上一篇: IMRR(镜像抑制比)计算和仿真 (1)