OpenCores
URL https://opencores.org/ocsvn/iqcorrection/iqcorrection/trunk

Subversion Repositories iqcorrection

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /iqcorrection
    from Rev 23 to Rev 24
    Reverse comparison

Rev 23 → Rev 24

/branches/implemented with real variables/IQCorrectGain_Phase.m
0,0 → 1,209
% New IQ Correction algorithm, yet the third one
close all;
clear all;
e1 = 0.1; %gain error
 
%phase error
a1 = 10*pi/180;
%a1 = -10*pi/180;
 
%original noise
sgma = 0.01; %noise sigmage
 
%original sample length
%n_dat = 250000; % number of samples
n_dat = 100000; % number of samples
 
freq = 0.03; % relative frequency
 
amplitude = 1;
 
%in phase signal, or I
x1=amplitude*cos(2*pi*(0:n_dat-1)*freq)+sgma*randn(1,n_dat);
 
%quadrature signal, or Q
y1=amplitude*(1+e1)*sin(2*pi*(0:n_dat-1)*freq+a1) + sgma*randn(1,n_dat);
 
reg_1 = 0;
reg_2 = 1;
 
%original mu
%mu_1 = 0.0002;
%mu_2 = 0.0001;
 
%mu adjusted to closest powers of two in order to match VHDL implementation
mu_1 = 0.000244;
mu_2 = 0.000122;
 
 
y2=zeros(1,n_dat);
y3=zeros(1,n_dat);
reg_1_sv = zeros(1,n_dat);
reg_2_sv = zeros(1,n_dat);
 
 
 
 
 
 
 
 
 
 
I_data = fopen('I_data_octave', 'w+t', 'native');
Q_data = fopen('Q_data_octave', 'w+t', 'native');
 
phase_estimate = fopen('phase_error_estimate_octave', 'w+t', 'native');
gain_estimate = fopen('gain_error_estimate_octave', 'w+t', 'native');
 
 
 
for nn=1:n_dat
y2(nn) = y1(nn)-reg_1*x1(nn);
reg_1_sv(nn) = reg_1;
reg_1 = reg_1 + mu_1*x1(nn)*y2(nn);
 
fprintf (I_data, '%f\r\n', x1(nn));
fprintf (Q_data, '%f\r\n', y1(nn));
fprintf (phase_estimate, '%f\r\n', reg_1);
y3(nn) = y2(nn)*reg_2;
reg_2_sv(nn) = reg_2;
%original reg_2
%reg_2 = reg_2+mu_2*(abs(x1(nn))^2 - abs(y3(nn))^2);
 
%proposed reg_2
reg_2 = reg_2+mu_2*((x1(nn))^2 - (y3(nn))^2);
fprintf (gain_estimate, '%f\r\n', reg_2);
end
 
 
fclose(I_data);
fclose(Q_data);
 
fclose(phase_estimate);
fclose(gain_estimate);
 
 
 
 
 
figure(1)
subplot(2,1,1);
plot(reg_1_sv);
hold on;
plot([0 n_dat], [1 1]*a1*(1+e1), 'r');
hold off;
grid on;
title('Phase Error Estimate Trajectory')
 
subplot(2,1,2)
plot(reg_2_sv);
hold on
 
%original plot
%plot([0 n_dat], [1.0 1.0]/(1.0+e1), 'r');
 
%proposed plot
plot([0 n_dat], [1.0 1.0]/((1.0+e1)*(cos(a1))), 'r');
hold off
grid on
title('Gain Error Estimate Trajectory')
%added following line to make pngs
print("figure1_longer.png", "-dpng")
 
figure(2)
subplot(1,3,1)
plot(x1,y1)
hold on
plot(x1,y1,'r.')
plot([1 1 -1 -1 1],[1 -1 -1 1 1],'-r')
hold off
grid on
axis('square')
axis([-1.2 1.2 -1.2 1.2])
title('Lissajou Diagram, Gain & Phase Offset')
 
subplot(1,3,2)
plot(x1, y2)
hold on
plot(x1,y2, 'r.')
plot([1 1 -1 -1 1],[1 -1 -1 1 1],'-r')
hold off
grid on
axis('square')
axis([-1.2 1.2 -1.2 1.2])
title('Lissajou Diagram, Phase Offset Corrected')
 
subplot(1,3,3)
plot(x1, y3)
hold on
plot(x1,y3, 'r.')
plot([1 1 -1 -1 1],[1 -1 -1 1 1],'-r')
hold off
grid on
axis('square')
axis([-1.2 1.2 -1.2 1.2])
title('Lissajou Diagram, Gain & Phase Offset Corrected')
 
%added following line to make pngs
+ + +figure(3) +subplot(3,1,1) + +%original MATLAB code used kaiser window function +%is commented out in this section. +%kaiser is in the package octave-windows +%this package turned out to be hard to install +%kaiser was replaced with blackman-harris window function. +%ww=kaiser(1024,12)'; + +ww=blackman(1024)'; + + +ww=ww/sum(ww); +tt=n_dat-1023:n_dat; +plot(-0.5:1/1024:0.5-1/1024,fftshift(20*log10(abs(fft((x1(tt)+1i*y1(tt)).*ww))))) +% z=zeros(1,1024); +% for kk=1:1024 +% z(kk)=(x1(tt(kk))+1i*y1(tt(kk)))*ww(kk); +% end +% plot(-0.5:1/1024:0.5-1/1024,fftshift(20*log10(abs(fft(z))))) +grid on +axis([-0.5 0.5 -140 10]) +title('Output Spectrum with Gain and Phase Offset') + +subplot(3,1,2) +tt=n_dat-1023:n_dat; +% z=zeros(1,1024); +% for kk=1:1024 +% z(kk)=(x1(tt(kk))+1i*y2(tt(kk)))*ww(kk); +% end +% plot(-0.5:1/1024:0.5-1/1024,fftshift(20*log10(abs(fft(z))))); +plot(-0.5:1/1024:0.5-1/1024,fftshift(20*log10(abs(fft((x1(tt)+1i*y2(tt)).*ww))))) +grid on +axis([-0.5 0.5 -140 10]) +title('Output Spectrum with Phase Offset Corrected') + +subplot(3,1,3) +tt=n_dat-1023:n_dat; +% z=zeros(1,1024); +% for kk=1:1024 +% z(kk)=(x1(tt(kk))+1i*y3(tt(kk)))*ww(kk); +% end +% plot(-0.5:1/1024:0.5-1/1024,fftshift(20*log10(abs(fft(z))))); +plot(-0.5:1/1024:0.5-1/1024,fftshift(20*log10(abs(fft((x1(tt)+1i*y3(tt)).*ww))))) +grid on +axis([-0.5 0.5 -140 10]) +title('Output Spectrum with Gain & Phase Offset Corrected') + +%added following line to make pngs +print("figure3_longer.png", "-dpng") + +disp('last reg_1 is ') +reg_1 +reg_2 \ No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.