Sampling Frequency offset impairment in MATLAB
This section of MATLAB source code covers Sampling Frequency offset impairment and Sampling Frequency offset effect on constellation diagram using matlab code.
Part A and PART C of the matlab code is same as mentioned on AWGN page.
Source code-PART B
SCO = 50e-6; % value of SCO
out = RX_SCO(out,SCO);
figure;plot(real(out),imag(out),'b+');title('constellation with Sampling Frequency Offset impairment');
out = RX_SCO(out,SCO);
figure;plot(real(out),imag(out),'b+');title('constellation with Sampling Frequency Offset impairment');
RX_SCO.m
function out = RX_SCO(in,SCO);
[M N] = size(in);
if(SCO ~= 0)
indx = (1:M)*(1+SCO);
if SCO > 0
in = [in; zeros(fix(indx(end))-M,N)]; % zero-padding: extra
% samples are needed
for kk=1:N
in2(:,kk) = lrange_interp(in(:,kk),indx,'cubic');
end
else
in = [zeros(1,N); in];
indx = indx+1;
for kk=1:N
in2(:,kk) = lrange_interp(in(:,kk),indx,'cubic');
end
end
out = in2;
else
out = in;
end
[M N] = size(in);
if(SCO ~= 0)
indx = (1:M)*(1+SCO);
if SCO > 0
in = [in; zeros(fix(indx(end))-M,N)]; % zero-padding: extra
% samples are needed
for kk=1:N
in2(:,kk) = lrange_interp(in(:,kk),indx,'cubic');
end
else
in = [zeros(1,N); in];
indx = indx+1;
for kk=1:N
in2(:,kk) = lrange_interp(in(:,kk),indx,'cubic');
end
end
out = in2;
else
out = in;
end
lrange_interp.m
function yi = lrange_interp(y,xi,interptype)
% Check arguments
if(nargin ~= 3)
error('fast_interp expects 3 arguments');
end
if( (xi > length(y)) | (xi < 1) )
error('xi must be between 1 and the length of y');
end
if(~ischar(interptype))
error('Interpolation type must be a string');
end
% For linear interpolation, just use matlab's linear
% interpolation function
if(strcmp(interptype,'linear') == 1) yi = interp1(1:length(y),y,xi,'*linear');
% For cubic interpolation, calculate piecewise lagrange
% polynomial at specified points
elseif(strcmp(interptype,'cubic') == 1)
yi = cubic_lrange(y,xi);
% Otherwise print an error to the screen
else
error('interptype must be either linear or cubic');
end
% Check arguments
if(nargin ~= 3)
error('fast_interp expects 3 arguments');
end
if( (xi > length(y)) | (xi < 1) )
error('xi must be between 1 and the length of y');
end
if(~ischar(interptype))
error('Interpolation type must be a string');
end
% For linear interpolation, just use matlab's linear
% interpolation function
if(strcmp(interptype,'linear') == 1) yi = interp1(1:length(y),y,xi,'*linear');
% For cubic interpolation, calculate piecewise lagrange
% polynomial at specified points
elseif(strcmp(interptype,'cubic') == 1)
yi = cubic_lrange(y,xi);
% Otherwise print an error to the screen
else
error('interptype must be either linear or cubic');
end
lrange_coeff.m
function [coeffs] = lrange_coeff(order,mu)
% Calculates the coefficients of an interpolator filter with
% a given interpolation order and a time shift 'mu'.
% mu is centered around a symmetrical interval [-1,1]
mu = (mu-0.5)*2/order;
% coefficients are calculated following Lagrange interpolation
if (order == 1) % linear
coeffs = [0.5+0.5.*mu 0.5-0.5.*mu];
elseif (order == 2) % quadratic
coeffs = [ 0.5.*mu + 0.5.*mu.^2 ...
1 - mu.^2 ...
-0.5.*mu + 0.5.*mu.^2 ];
elseif (order == 3) % cubic
mu2 = mu.*mu; % mu squared
mu3 = mu2.*mu;% mu cubed
coeffs = [ -0.0625 - 0.0625.*mu + 0.5625.*mu2 + 0.5625.*mu3 ...
0.5625 + 1.6875.*mu - 0.5625.*mu2 - 1.6875.*mu3 ...
0.5625 - 1.6875.*mu - 0.5625.*mu2 + 1.6875.*mu3 ...
-0.0625 + 0.0625.*mu + 0.5625.*mu2 - 0.5625.*mu3 ];
end;
% Calculates the coefficients of an interpolator filter with
% a given interpolation order and a time shift 'mu'.
% mu is centered around a symmetrical interval [-1,1]
mu = (mu-0.5)*2/order;
% coefficients are calculated following Lagrange interpolation
if (order == 1) % linear
coeffs = [0.5+0.5.*mu 0.5-0.5.*mu];
elseif (order == 2) % quadratic
coeffs = [ 0.5.*mu + 0.5.*mu.^2 ...
1 - mu.^2 ...
-0.5.*mu + 0.5.*mu.^2 ];
elseif (order == 3) % cubic
mu2 = mu.*mu; % mu squared
mu3 = mu2.*mu;% mu cubed
coeffs = [ -0.0625 - 0.0625.*mu + 0.5625.*mu2 + 0.5625.*mu3 ...
0.5625 + 1.6875.*mu - 0.5625.*mu2 - 1.6875.*mu3 ...
0.5625 - 1.6875.*mu - 0.5625.*mu2 + 1.6875.*mu3 ...
-0.0625 + 0.0625.*mu + 0.5625.*mu2 - 0.5625.*mu3 ];
end;
cubic_lrange.m
function yi = cubic_lrange(y,xi);
y = reshape(y,length(y),1); % make sure y is a column vector
y(end+1:end+2) = 0;
y = [0;y];
xi = xi + 1;
% Get fractional part of indices
mu = xi - floor(xi);
% Get integer part of indices
xi = floor(xi);
% Get values from y used for cubic interpolation
xi = reshape([y(xi+2) y(xi+1) y(xi) y(xi-1)],length(mu),4);
% Perform interpolation using piecewise Lagrange polynomials
yi = sum((xi.*lrange_coeff(3,mu.')).');
y = reshape(y,length(y),1); % make sure y is a column vector
y(end+1:end+2) = 0;
y = [0;y];
xi = xi + 1;
% Get fractional part of indices
mu = xi - floor(xi);
% Get integer part of indices
xi = floor(xi);
% Get values from y used for cubic interpolation
xi = reshape([y(xi+2) y(xi+1) y(xi) y(xi-1)],length(mu),4);
% Perform interpolation using piecewise Lagrange polynomials
yi = sum((xi.*lrange_coeff(3,mu.')).');
Useful Links to MATLAB codes
Refer following as well as links mentioned on left side panel for useful MATLAB codes.
OFDM Preamble generation
Time off estimation corr
Freq off estimation corr
channel estimation
11a WLAN channel
PN sequence generation
OFDMA Tx Rx
AES DES
carrier aggregation
CCDF
FIR Filter
IIR Filter
Low Pass FIR
Viterbi decoder
CRC8 CRC32
RF and Wireless tutorials
WLAN 802.11ac 802.11ad wimax Zigbee z-wave GSM LTE UMTS Bluetooth UWB IoT satellite Antenna RADAR