- added
git-svn-id: http://moon:8086/svn/matlab/trunk@157 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
Executable
+4
@@ -0,0 +1,4 @@
|
||||
function y = CalcSincFilter(scale, freq, N)
|
||||
|
||||
t = linspace(-(N-1)/2, (N-1)/2, N);
|
||||
y = scale*sinc(freq*t);
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
function y = FIRCalcBandpass(omega, bw, N);
|
||||
%
|
||||
% y = FIRCalcLowpass(omega, N);
|
||||
|
||||
y = CalcSincFilter(bw, bw, N).*wkaiser(N, 8.0).*cos(2*pi*omega.*(0:N-1));
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
function y = FIRCalcHighpass(omega, N);
|
||||
%
|
||||
% y = FIRCalcHighpass(omega, N);
|
||||
|
||||
y_lp = CalcSincFilter(omega, omega, N);
|
||||
y_hp = -y_lp;
|
||||
|
||||
if mod(N, 2) == 0
|
||||
error ('Even N is not supported');
|
||||
else
|
||||
y_hp((N-1)/2+1) = 1 + y_hp((N-1)/2+1);
|
||||
end
|
||||
|
||||
y = (y_hp).*wkaiser(N, 8.0);
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
function y = FIRCalcLowpass(omega, N);
|
||||
%
|
||||
% y = FIRCalcLowpass(omega, N);
|
||||
|
||||
y = CalcSincFilter(omega, omega, N).*wkaiser(N, 8.0);
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
function agc_eval()
|
||||
%
|
||||
% Super peak-based AGC
|
||||
|
||||
N = 2000;
|
||||
k_noise = 1E-3;
|
||||
|
||||
t = (0:N-1)/N;
|
||||
x = sin(100*pi*t) + k_noise*randn(1, N);
|
||||
w = 1;
|
||||
K = 2;
|
||||
mu = 0.01;
|
||||
|
||||
max1 = maxlist_filterstate(1000, 1E12, 1);
|
||||
|
||||
for n=1:N,
|
||||
d1 = w*x(n);
|
||||
[d2, max1] = maxlist_filter(d1, max1);
|
||||
e = K - d2;
|
||||
w = w + mu*e*abs(x(n));
|
||||
d1_(n) = d1;
|
||||
e_(n) = e;
|
||||
end;
|
||||
|
||||
subplot(3, 1, 1)
|
||||
plot(t, x); grid; legend('x');
|
||||
subplot(3, 1, 2)
|
||||
plot(t, d1_); grid; legend('d_{1}');
|
||||
subplot(3, 1, 3)
|
||||
plot(t, 20*log10(abs(e_)+1e-12)); legend('20*log10(error)'); grid;
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
function [b, kn] = calcfir_srrc(fa, Tsym, a, N)
|
||||
|
||||
if mod(N,2) ~= 0
|
||||
delay = (N-1)/2;
|
||||
else
|
||||
delay = N/2;
|
||||
end
|
||||
|
||||
k = sqrt(2/Tsym);
|
||||
k0 = 0.5*Tsym*fa;
|
||||
kn = 1/k0;
|
||||
|
||||
for n=0:N-1,
|
||||
phi = (n-delay)/fa;
|
||||
if phi == 0.0
|
||||
b(n+1) = -k * (pi*(a-1.0) - 4*a) /(pi*fa);
|
||||
else
|
||||
if abs(abs(8*a*phi/Tsym) - 1.0) < sqrt(eps)
|
||||
b(n+1) = k / (2*pi*fa) * (pi*(a+1.0) * sin(pi*(a+1.0)/(4*a)) - 4*a * sin(pi*(a-1.0)/(4*a)) + pi*(a-1.0) * cos(pi*(a-1.0)/(4*a)));
|
||||
else
|
||||
term = 8*a*phi/Tsym;
|
||||
b(n+1) = -4*a/fa * ( cos((1.0+a)*2*pi*phi/Tsym) + sin((1.0-a)*2*pi*phi/Tsym) / (8*a*phi/Tsym)) / (pi * sqrt(1.0/(2/Tsym)) * (term*term - 1.0));
|
||||
end
|
||||
end
|
||||
b(n+1) = b(n+1) * k * k0;
|
||||
end;
|
||||
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
function y2 = decim_eval(N, M)
|
||||
|
||||
x = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
|
||||
x = randn(1, 1000);
|
||||
x = 1:20;
|
||||
w = FIRCalcLowpass(0.5, N);
|
||||
w = 1:N;
|
||||
|
||||
y = filter(w, 1, x)';
|
||||
y_dec = y(1:M:lge(y))
|
||||
y_dec2 = decim(w, M, N, x)'
|
||||
|
||||
y2 = y_dec2 - y_dec;
|
||||
|
||||
function [y] = decim(w, M, N, x)
|
||||
Nout = lge(x(1:M:lge(x)));
|
||||
|
||||
for k=0:M-1
|
||||
nz = fix(k/M) + (k > 0);
|
||||
d = (M-k) * (k > 0);
|
||||
xp = [zeros(1, nz) x(d+1:M:lge(x))]
|
||||
% xp = [zeros(1, k) x];
|
||||
% xp = xp(1:M:lge(x))
|
||||
wp = w(k+1:M:N);
|
||||
yp = filter(wp, 1, xp);
|
||||
summer(k+1, :) = yp(1:Nout);
|
||||
end;
|
||||
y = sum(summer, 1);
|
||||
|
||||
return;
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
function downconvert()
|
||||
omega_lp = 0.48;
|
||||
N_lp = 101;
|
||||
|
||||
N = 10000;
|
||||
w = 2*pi;
|
||||
n = (0:N-1);
|
||||
|
||||
rf = 0.4*cos(0.25*w*n);
|
||||
lo_r = cos(0.25*w*n);
|
||||
lo_i = -sin(0.25*w*n);
|
||||
w_lp = FIRCalcLowpass(omega_lp, N_lp);
|
||||
|
||||
im = 2*rf .*lo_r + i*2*rf.*lo_i;
|
||||
im_f = filter(w_lp, 1, real(im)) + i*filter(w_lp, 1, imag(im));
|
||||
|
||||
subplot(2, 1, 1)
|
||||
plot(n, rf, '-*'); grid;
|
||||
axis ([0 N-1 -1 1]);
|
||||
|
||||
subplot(2, 1, 2)
|
||||
plot(n, real(im_f), '-*', n, imag(im_f), '-*'); grid;
|
||||
axis ([0 N-1 -1 1]);
|
||||
|
||||
wavwrite(rf, 48000, 16, 'ddc_rf.wav');
|
||||
wavwrite(im, 48000, 16, 'ddc_im.wav');
|
||||
wavwrite(im_f, 48000, 16, 'ddc_imf.wav');
|
||||
Executable
+79
@@ -0,0 +1,79 @@
|
||||
function P = eval_farrow()
|
||||
M = 5;
|
||||
Nb = 33;
|
||||
R = 32;
|
||||
Np = R*(Nb+1);
|
||||
sr = 1;
|
||||
SRRC_ROLLOFF = 0.35;
|
||||
nsamplespersym = 2;
|
||||
|
||||
if (mod(Nb, 2) ~= 0)
|
||||
offset = R/2;
|
||||
else
|
||||
offset = R/2;
|
||||
end;
|
||||
% Simulation
|
||||
Ni = 1000;
|
||||
|
||||
close all;
|
||||
|
||||
[hp, kn] = calcfir_srrc(R*nsamplespersym*sr, 2/sr, SRRC_ROLLOFF, Np);
|
||||
hp = R*kn*hp; %.*kaiser(Np, 8)';
|
||||
%hp = gen_basefir(N, R, 0.125).*hann(R*N+1)';
|
||||
|
||||
hb = hp(offset+1:R:Np);
|
||||
freqz(hb);
|
||||
|
||||
P = fir_polyfit(M, R, hp, Nb, offset);
|
||||
|
||||
for k=1:Nb,
|
||||
pv((k-1)*Ni+1:k*Ni) = polyval(P(k,:), (0:Ni-1)/Ni);
|
||||
end;
|
||||
|
||||
figure;
|
||||
plot(offset:R:Np-1, hb, 'ro', 0:Np-1, hp, 'b+', R*(0:Nb*Ni-1)/Ni, pv, 'g-');
|
||||
legend('Base FIR', 'Prototype FIR', 'Interpolation');
|
||||
grid;
|
||||
|
||||
for pp=1:M,
|
||||
figure;
|
||||
pt = sprintf('C_{%d}', M-pp);
|
||||
plot(0:Nb-1, P(1:Nb, pp));
|
||||
title(pt);
|
||||
grid on;
|
||||
end;
|
||||
|
||||
Nd = 11;
|
||||
x = [1 zeros(1, Nb)];
|
||||
for d=1:Nd,
|
||||
mu(d) = (Nd-d)/(Nd-1);
|
||||
y(d,:) = farrow(x, P, mu(d));
|
||||
end;
|
||||
|
||||
figure;
|
||||
for d=0:R
|
||||
plot(hp(offset+1+d:R:offset+R*Nb+d)); grid on; hold on;
|
||||
end
|
||||
|
||||
figure;
|
||||
|
||||
for d=1:Nd,
|
||||
pt = sprintf('mu = %f', mu(d));
|
||||
plot(y(d,:)); grid on; hold on;
|
||||
% freqz(y(d,:));
|
||||
legend(pt);
|
||||
F(d) = getframe;
|
||||
end;
|
||||
|
||||
fid = fopen('farrow_coeff.dat','wb');
|
||||
|
||||
fwrite(fid,M,'uint');
|
||||
fwrite(fid,Nb,'uint');
|
||||
fwrite(fid,P,'float');
|
||||
|
||||
fclose(fid);
|
||||
%for mm=1:M
|
||||
% for nn=1:Nb
|
||||
|
||||
|
||||
movie(F,3, 12)
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
function y = farrow(x, P, mu)
|
||||
|
||||
D = size(P);
|
||||
N = D(1);
|
||||
M = D(2);
|
||||
|
||||
% Partial filter responses
|
||||
for pp=1:M,
|
||||
hp(pp, :) = filter(P(1:N, pp), 1, x);
|
||||
end;
|
||||
|
||||
h = hp';
|
||||
% Combine
|
||||
for k=1:length(x),
|
||||
y(k) = horner(h(k,:), mu);
|
||||
end;
|
||||
|
||||
function y = horner(a,x)
|
||||
% Input a is the polynomial coefficient vector, x the value to be evaluated at.
|
||||
% The output y is the evaluated polynomial and b the divided coefficient vector.
|
||||
b(1) = a(1);
|
||||
for i = 2:length(a)
|
||||
b(i) = a(i)+x*b(i-1);
|
||||
end
|
||||
y = b(length(a));
|
||||
b = b(1:length(b)-1);
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
function P = fir_polyfit(M, R, hp, Nb, offset)
|
||||
|
||||
Np = length(hp);
|
||||
order = M - 1;
|
||||
|
||||
for k=1:Nb,
|
||||
P(k,:) = polyfit((0:R)/R, hp(offset+(k-1)*R+1:offset+k*R+1), order);
|
||||
end;
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
function fse_eval()
|
||||
|
||||
N = 7;
|
||||
M = 2;
|
||||
L = 5000;
|
||||
mu = 0.05;
|
||||
|
||||
% Model source
|
||||
j = sqrt(-1);
|
||||
s(1:2:L) = 0.5-(rand(L/2,1)) + (0.5-(rand(L/2,1)))*j;
|
||||
s(2:2:L) = 2*(0.5-round(rand(L/2,1))) + 2*(0.5-round(rand(L/2,1)))*j;
|
||||
s = 1/sqrt(2)*s';
|
||||
|
||||
|
||||
% Model channel
|
||||
cb = 1;
|
||||
ca = [1 0.7];
|
||||
hd = zeros(N,1);
|
||||
hd(fix(N/2)) = 1;
|
||||
|
||||
% Filter source
|
||||
r = [zeros(1,N-1) filter(cb,ca,s)']';
|
||||
awgn = 2*(0.5-randn(L+N-1,1)) + 2*(0.5-randn(L+N-1,1))*j;
|
||||
r = r + 0.0004*awgn;
|
||||
f = [0 zeros(1, N-1)]';
|
||||
d = filter(hd,1,s(2:M:L));
|
||||
|
||||
k = 0;
|
||||
for n=1:M:L-N
|
||||
k = k + 1;
|
||||
x = r(N+n-1:-1:n);
|
||||
y(k) = f'*x;
|
||||
e(k) = d(k) - y(k);
|
||||
f = f + mu*conj(e(k))*x;
|
||||
end;
|
||||
ss = filter(f,1,r);
|
||||
|
||||
close all;
|
||||
figure(1)
|
||||
plot(abs(e))
|
||||
grid
|
||||
|
||||
figure(2)
|
||||
plot(r,'g+')
|
||||
hold on
|
||||
plot(ss,'bx')
|
||||
plot(s,'ro')
|
||||
hold off
|
||||
grid
|
||||
|
||||
figure(3)
|
||||
plot(1:k, abs(y));
|
||||
grid
|
||||
|
||||
f
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
function interpol_eval(N, L)
|
||||
|
||||
x = [0 1 0 0];
|
||||
x_int = [];
|
||||
|
||||
for i=1:lge(x)
|
||||
x_int = [x_int x(i) zeros(1, L-1)];
|
||||
end;
|
||||
|
||||
if mod(N, 2) == 0
|
||||
LN = L*N;
|
||||
else
|
||||
LN = L*(N-1)+1;
|
||||
end
|
||||
|
||||
w = FIRCalcLowpass(0.35, LN);
|
||||
w = 1:LN;
|
||||
|
||||
y_int = filter(w, 1, x_int)'
|
||||
|
||||
y_int2 = interpol(w, L, LN, x)'
|
||||
|
||||
function [y] = interpol(w, L, N, x)
|
||||
Nout = L*lge(x);
|
||||
|
||||
for k=0:L-1
|
||||
wp = w((L-k-1)+1:L:N);
|
||||
yp = filter(wp, 1, x)';
|
||||
y((L-k-1)+1:L:Nout) = yp;
|
||||
end;
|
||||
|
||||
return;
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
function lgip(order)
|
||||
|
||||
Nlg = order + 1;
|
||||
Npts = 11;
|
||||
t = Nlg/2 + ((0:Npts-1)/(Npts-1)-0.5)
|
||||
xk = [0 0.5 0];
|
||||
for k=1:Npts,
|
||||
y(k) = 0;
|
||||
for i=0:Nlg-1,
|
||||
hlg = 1;
|
||||
for j=0:Nlg-1,
|
||||
if (i ~= j)
|
||||
hlg = hlg * (t(k) - j)/((i)-(j));
|
||||
end;
|
||||
end;
|
||||
y(k) = y(k) + xk(i+1) * hlg;
|
||||
end;
|
||||
end;
|
||||
plot(y); grid;
|
||||
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
function lgip(order)
|
||||
|
||||
Nlg = order + 1;
|
||||
Npts = 100;
|
||||
t = (0:Npts-1)/Npts;
|
||||
xk = [0 0.5 0];
|
||||
for k=1:Npts,
|
||||
y(k) = 0;
|
||||
for i=0:Nlg-1,
|
||||
hlg = 1;
|
||||
for j=0:Nlg-1,
|
||||
if (i ~= j)
|
||||
hlg = hlg * (Nlg/2 - 0.5 + t(k) - j)/(i-j);
|
||||
end;
|
||||
end;
|
||||
y(k) = y(k) + xk(i+1) * hlg;
|
||||
end;
|
||||
end;
|
||||
plot(t, y); grid;
|
||||
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
function [xmax lsize] = maxlist(x, L, L_max, mode)
|
||||
|
||||
P = 1E24;
|
||||
u = zeros(L, 1);
|
||||
p = zeros(L, 1);
|
||||
u_last = zeros(L, 1);
|
||||
p_last = zeros(L, 1);
|
||||
|
||||
OFF = 1;
|
||||
|
||||
u_last(1 + OFF) = P;
|
||||
u_last(0 + OFF) = 0;
|
||||
p_last(0 + OFF) = 0 + OFF;
|
||||
N = 0 + OFF;
|
||||
|
||||
x = mode*x;
|
||||
|
||||
for k=1:lge(x),
|
||||
if (p_last(N) == (L + OFF))
|
||||
m = 0;
|
||||
u_last(N) = P;
|
||||
else
|
||||
m = 1;
|
||||
end
|
||||
N = min(L_max, N + m);
|
||||
|
||||
ii = 0;
|
||||
while x(k) >= u_last(ii+1+OFF)
|
||||
ii = ii + 1;
|
||||
end
|
||||
N = N - ii;
|
||||
|
||||
for jj=(1 + OFF):(N -1)
|
||||
u(jj+1) = u_last(jj+ii);
|
||||
p(jj+1) = p_last(jj+ii) + 1;
|
||||
end
|
||||
u(N+1) = P;
|
||||
p(N+1) = 0;
|
||||
u(1 + OFF) = x(k);
|
||||
p(1 + OFF) = 1 + OFF;
|
||||
xmax(k) = mode*u(N);
|
||||
pmax = p(N);
|
||||
lsize(k) = find(u == P, 1);
|
||||
u_last(1:lsize(k)) = u(1:lsize(k));
|
||||
p_last(1:lsize(k)) = p(1:lsize(k));
|
||||
end;
|
||||
Executable
+51
@@ -0,0 +1,51 @@
|
||||
function [xmin, xmax] = maxlist_eval(x, L)
|
||||
|
||||
mode = 1;
|
||||
for s=1:2
|
||||
mode = -mode;
|
||||
|
||||
P = mode*1234;
|
||||
u = zeros(L, 1);
|
||||
p = zeros(L, 1);
|
||||
u_last = zeros(L, 1);
|
||||
p_last = zeros(L, 1);
|
||||
|
||||
OFF = 1;
|
||||
|
||||
u_last(1 + OFF) = P;
|
||||
u_last(0 + OFF) = 0;
|
||||
p_last(0 + OFF) = 0 + OFF;
|
||||
N = 0 + OFF;
|
||||
|
||||
for k=1:lge(x),
|
||||
if (p_last(N) == (L + OFF))
|
||||
m = 0;
|
||||
u_last(N) = P;
|
||||
else
|
||||
m = 1;
|
||||
end
|
||||
|
||||
ii = 0;
|
||||
while mode*x(k) >= mode*u_last(ii+1+OFF)
|
||||
ii = ii + 1;
|
||||
end
|
||||
N = N - ii + m;
|
||||
|
||||
for jj=(1 + OFF):(N -1)
|
||||
u(jj+1) = u_last(jj+ii);
|
||||
p(jj+1) = p_last(jj+ii) + 1;
|
||||
end
|
||||
u(N+1) = P;
|
||||
u(1 + OFF) = x(k);
|
||||
p(1 + OFF) = 1 + OFF;
|
||||
u_last = u;
|
||||
p_last = p;
|
||||
if (mode < 0)
|
||||
xmin(k) = u(N);
|
||||
pmmin = p(N);
|
||||
else
|
||||
xmax(k) = u(N);
|
||||
pmax = p(N);
|
||||
end
|
||||
end;
|
||||
end;
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
function [xmax,zf] = maxlist_filter(x, zi)
|
||||
|
||||
OFF = 1;
|
||||
x = zi.mode*x;
|
||||
|
||||
m = 1;
|
||||
if (zi.p_last(zi.N) == (zi.L + OFF))
|
||||
m = 0;
|
||||
zi.u_last(zi.N) = zi.P;
|
||||
end
|
||||
|
||||
ii = 0;
|
||||
while x >= zi.u_last(ii+1+OFF)
|
||||
ii = ii + 1;
|
||||
end
|
||||
zi.N = zi.N - ii + m;
|
||||
|
||||
for jj=(1 + OFF):(zi.N -1)
|
||||
zi.u(jj+1) = zi.u_last(jj+ii);
|
||||
zi.p(jj+1) = zi.p_last(jj+ii) + 1;
|
||||
end
|
||||
zi.u(zi.N+1) = zi.P;
|
||||
zi.p(zi.N+1) = 0;
|
||||
zi.u(1 + OFF) = x;
|
||||
zi.p(1 + OFF) = 1 + OFF;
|
||||
lsize = find(zi.u == zi.P, 1);
|
||||
zi.u_last(1:lsize) = zi.u(1:lsize);
|
||||
zi.p_last(1:lsize) = zi.p(1:lsize);
|
||||
xmax = zi.mode*zi.u(zi.N);
|
||||
zf = zi;
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
function s = maxlist_filterstate(L, P, mode)
|
||||
s = struct('p', 'u', 'p_last', 'u_last', 'N', 'L', 'P', 'mode');
|
||||
|
||||
OFF = 1;
|
||||
|
||||
s.p = zeros(L, 1);
|
||||
s.u = zeros(L, 1);
|
||||
s.p_last = zeros(L, 1);
|
||||
s.u_last = zeros(L, 1);
|
||||
|
||||
s.u_last(1 + OFF) = P;
|
||||
s.u_last(0 + OFF) = 0;
|
||||
s.p_last(0 + OFF) = 0 + OFF;
|
||||
s.N = 0 + OFF;
|
||||
|
||||
s.L = L;
|
||||
s.P = P;
|
||||
s.mode = mode;
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
% function pmf_eval(M, mu)
|
||||
|
||||
function pmf_eval(M, mu)
|
||||
|
||||
% Symbol rate
|
||||
fs = 6000;
|
||||
Ts = 1/fs;
|
||||
|
||||
% Samples per symbol
|
||||
N = 4;
|
||||
|
||||
% Number of polyphase taps
|
||||
Nh1 = 31
|
||||
|
||||
% Polyphase upconversion
|
||||
Nh2 = M*(Nh1+0)
|
||||
|
||||
h1 = firrcos(Nh1, 1/Ts, 0.35, N*fs, 'rolloff');
|
||||
h2 = M*firrcos(Nh2, 1/Ts, 0.35, M*N*fs, 'rolloff');
|
||||
index = mod(mu,M);
|
||||
|
||||
h2a = h2(1+index:M:Nh2);
|
||||
nh2a = length(h2a)
|
||||
close all;
|
||||
sum(h1)
|
||||
plot(1:Nh1, h1(1:Nh1), '-x', 1:nh2a, h2a(1:nh2a), '-o');
|
||||
grid;
|
||||
Executable
+24
@@ -0,0 +1,24 @@
|
||||
function pointtracker_eval()
|
||||
|
||||
N = 10000;
|
||||
|
||||
mu = 0.5;
|
||||
|
||||
variance = 0.01;
|
||||
IQ = [0.707; 0.707];
|
||||
IQ_n = repmat(IQ, 1, N) + variance*randn(2,N)/sqrt(12);
|
||||
size(IQ_n)
|
||||
ref = [1; 1];
|
||||
|
||||
for n=1:N,
|
||||
d(n) = sqrt(sum((IQ_n(n) - ref).^2));
|
||||
ref = ref + mu*(IQ_n(n)-ref);
|
||||
end;
|
||||
|
||||
ref
|
||||
close all;
|
||||
plot(IQ_n(1,:), IQ_n(2,:), '.', ref(1), ref(2), 'r.'); grid;
|
||||
|
||||
figure;
|
||||
|
||||
plot(1:N, d); grid;
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
function qtbl(N)
|
||||
|
||||
j = sqrt(-1);
|
||||
signI = [+1 -1 -1 +1]
|
||||
signQ = [+1 +1 -1 -1]
|
||||
rot = pi/4;
|
||||
Ns = sqrt(N)
|
||||
Nq = N/4
|
||||
Nsq = sqrt(Nq)
|
||||
stepIQ = sqrt(2)/(Ns-1)
|
||||
|
||||
|
||||
qq = 1/sqrt(2);
|
||||
ii = 1/sqrt(2);
|
||||
|
||||
even = 1;
|
||||
c = 1;
|
||||
close all;
|
||||
figure(1);
|
||||
axis ([-1 1 -1 1]);
|
||||
grid;
|
||||
hold;
|
||||
for m=1:Nsq
|
||||
for n=1:Nsq
|
||||
I = ii;
|
||||
Q = qq;
|
||||
for q = 0:3,
|
||||
IQ(Nq*q+c) = I*signI(q+1) + j*Q*signQ(q+1);
|
||||
T = I;
|
||||
I = Q;
|
||||
Q = T;
|
||||
end;
|
||||
ii = ii - even*stepIQ;
|
||||
c = c + 1;
|
||||
end;
|
||||
qq = qq - stepIQ;
|
||||
ii = ii + even*stepIQ;
|
||||
even = -even;
|
||||
end;
|
||||
|
||||
for c=1:N,
|
||||
sym = c - 1
|
||||
plot(IQ(c), '+');
|
||||
pause;
|
||||
end;
|
||||
IQ
|
||||
Executable
+380
@@ -0,0 +1,380 @@
|
||||
% dpll.m
|
||||
%
|
||||
% dpll(fa, fc, sr, mode, file, do_plot)
|
||||
% Example: dpll(48000, 12000, 6000, 'Costas', 'qam.dat', 1);
|
||||
% Mode : Normal | Costas
|
||||
|
||||
function result_rx(name)
|
||||
|
||||
plot_psd = 0;
|
||||
do_plot = 1;
|
||||
fa = 48000;
|
||||
file = sprintf('%s_rf.dat',name);
|
||||
|
||||
fid = fopen(file,'r');
|
||||
m = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_bitclk.dat'],'r');
|
||||
bitClk= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_modulus.dat'],'r');
|
||||
modulus= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_softsym_eq_i.dat'],'r');
|
||||
softsym_eq_i= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_softsym_eq_q.dat'],'r');
|
||||
softsym_eq_q= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_softsym_i.dat'],'r');
|
||||
softsym_i= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_softsym_q.dat'],'r');
|
||||
softsym_q= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
softsym_eq = softsym_eq_i + i*softsym_eq_q;
|
||||
softsym = softsym_i + i*softsym_q;
|
||||
|
||||
close all;
|
||||
|
||||
if (do_plot)
|
||||
|
||||
fid = fopen([name '_symstat_p.dat'],'r');
|
||||
symstat_p = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_symstat_err_mag.dat'],'r');
|
||||
symstat_err_mag = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_symstat_err_phi.dat'],'r');
|
||||
symstat_err_phi = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_loi.dat'],'r');
|
||||
lo_I = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_loq.dat'],'r');
|
||||
lo_Q = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_i.dat'],'r');
|
||||
I = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_q.dat'],'r');
|
||||
Q = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_if.dat'],'r');
|
||||
IF = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_qf.dat'],'r');
|
||||
QF= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_ircf.dat'],'r');
|
||||
IRCF = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_qrcf.dat'],'r');
|
||||
QRCF= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_ircf_rm.dat'],'r');
|
||||
IRCF_RM = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_qrcf_rm.dat'],'r');
|
||||
QRCF_RM= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_ted.dat'],'r');
|
||||
TED= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_perr.dat'],'r');
|
||||
perr= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_domega.dat'],'r');
|
||||
dOmega = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_agc_mag.dat'],'r');
|
||||
agc_mag = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_agc_bal.dat'],'r');
|
||||
agc_bal = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_pwr_I.dat'],'r');
|
||||
pwr_I = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_pwr_Q.dat'],'r');
|
||||
pwr_Q = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_vco_lock.dat'],'r');
|
||||
vco_lock= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_str_lock.dat'],'r');
|
||||
str_lock= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_vld_var1.dat'],'r');
|
||||
vld_var1= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_vld_var2.dat'],'r');
|
||||
vld_var2= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_domega.dat'],'r');
|
||||
domega_nco= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_cma_i.dat'],'r');
|
||||
cma_i= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_cma_q.dat'],'r');
|
||||
cma_q= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_cma_eq_i.dat'],'r');
|
||||
cma_eq_i= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_cma_eq_q.dat'],'r');
|
||||
cma_eq_q= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_cef_real.dat'],'r');
|
||||
cef_r= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
fid = fopen([name '_cef_imag.dat'],'r');
|
||||
cef_i= fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
cef = cef_r + i*cef_i;
|
||||
|
||||
fid = fopen([name '_impulse_armfilter.dat'],'r');
|
||||
armfilter = fread(fid, 1024, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
N = lge(m);
|
||||
K = lge(lo_I);
|
||||
S = lge(perr);
|
||||
nSymbols = length(softsym_eq);
|
||||
|
||||
plot(0:length(cef)-1, real(cef), 0:length(cef)-1, imag(cef));
|
||||
legend('Real','Imag');
|
||||
grid;
|
||||
figure;
|
||||
|
||||
freqz(abs(cef));
|
||||
figure;
|
||||
subplot(2,1,1)
|
||||
plot(1:K,lo_I,'b',1:K,lo_Q,'g');
|
||||
legend('Local Osc I','Local Osc Q');
|
||||
grid;
|
||||
|
||||
subplot(2,1,2)
|
||||
plot(1:S,dOmega,'r');
|
||||
legend('dOmega');
|
||||
xlabel('n');
|
||||
ylabel('-');
|
||||
grid;
|
||||
|
||||
figure;
|
||||
freqz(armfilter');
|
||||
title('Arm filter I');
|
||||
|
||||
figure
|
||||
subplot(3,1,1)
|
||||
plot(1:S, agc_mag, 'b', 1:S, agc_bal, 'g', 1:S, min(2, pwr_I./pwr_Q), 'r')
|
||||
legend('AGC gain','AGC err', 'AGC I/Q');
|
||||
grid;
|
||||
|
||||
subplot(3,1,2)
|
||||
plot(1:S, vld_var1, 'b-', 1:S, vld_var2, 'g-');
|
||||
legend('Magnitude noise','Phase noise');
|
||||
ylabel('dB');
|
||||
grid;
|
||||
|
||||
subplot(3,1,3)
|
||||
plot(1:S, 0.99*vco_lock, 'b-',1:S, 0.99*str_lock, 'g-');
|
||||
legend('VCO Lock','STR Lock');
|
||||
grid;
|
||||
|
||||
slices = find(bitClk);
|
||||
n_slices = length(slices);
|
||||
bc_amp_i = bitClk(slices).*IRCF(slices);
|
||||
bc_amp_q = bitClk(slices).*QRCF(slices);
|
||||
|
||||
figure
|
||||
subplot(3,1,1)
|
||||
plot(1:K,IRCF ,'b',1:K,QRCF ,'g',slices,bc_amp_i,'r+',slices,bc_amp_q,'ro');
|
||||
legend('Resampled I','Resampled Q','Clock','Clock');
|
||||
grid;
|
||||
|
||||
subplot(3,1,2)
|
||||
plot(1:K,TED ,'b');
|
||||
legend('TED_{n}');
|
||||
grid;
|
||||
|
||||
subplot(3,1,3)
|
||||
plot(1:K,QRCF_RM ,'g',1:K,IRCF_RM ,'b');
|
||||
legend('mu', 'm_{n}');
|
||||
grid;
|
||||
|
||||
%figure
|
||||
%len_w = length(cef_w);
|
||||
%plot(0:len_w-1, cef_w);
|
||||
%title('Channel Estimation Filter Weights');
|
||||
%xlabel('n');
|
||||
%grid;
|
||||
|
||||
figure
|
||||
subplot(3,1,1)
|
||||
plot(1:S, cma_eq_i, 1:S, cma_i);
|
||||
title('SNR');
|
||||
legend('Online', 'Offline');
|
||||
grid;
|
||||
subplot(3,1,2)
|
||||
plot(1:S, cma_eq_q, 'b-', 1:S, cma_q, 'r-');
|
||||
title('CEF SNR Distance');
|
||||
legend('Distance','Updates');
|
||||
grid;
|
||||
subplot(3,1,3)
|
||||
plot(1:S,perr);
|
||||
title('Phase error');
|
||||
xlabel('n');
|
||||
legend('Phi(Err_{I},Err_{Q})');
|
||||
grid;
|
||||
|
||||
figure;
|
||||
subplot(2,1,1)
|
||||
plot(1:lge(modulus),modulus);
|
||||
title('Modulus');
|
||||
xlabel('n');
|
||||
legend('Modulus');
|
||||
grid;
|
||||
subplot(2,1,2)
|
||||
bar(hist(modulus, 20));
|
||||
title('Hist');
|
||||
xlabel('Magnitude');
|
||||
legend('Hist');
|
||||
grid;
|
||||
|
||||
figure;
|
||||
plot_range = fix(length(softsym_eq)/2+1):length(softsym_eq);
|
||||
%plot(IRCF + i* QRCF,'cx');
|
||||
hold on;
|
||||
plot(softsym(plot_range), 'cx')
|
||||
plot(softsym_eq(plot_range), 'bx')
|
||||
hold off;
|
||||
title('Diagram demodulated data')
|
||||
axis([-1.0 1.0 -1.0 1.0]);
|
||||
xlabel('Re(mod)');
|
||||
ylabel('Im(mod)');
|
||||
grid;
|
||||
|
||||
mean2 = mean(abs(softsym_eq(plot_range)).^2);
|
||||
mean4 = mean(abs(softsym_eq(plot_range)).^4);
|
||||
R2 = mean4/mean2;
|
||||
R4 = mean4/(mean2*mean2);
|
||||
|
||||
mean_soft_i = mean(real(softsym))
|
||||
mean_soft_q = mean(imag(softsym))
|
||||
mean_soft_eq_i = mean(real(softsym_eq))
|
||||
mean_soft_eq_q = mean(imag(softsym_eq))
|
||||
|
||||
figure;
|
||||
nConst = length(symstat_p);
|
||||
|
||||
subplot(3,1,1),
|
||||
bar(0:nConst-1, symstat_p);
|
||||
axis([0 nConst-1 0 1.1*max(symstat_p)]);
|
||||
title('Symbol Probability');
|
||||
grid;
|
||||
|
||||
subplot(3,1,2),
|
||||
bar(0:nConst-1, symstat_err_mag);
|
||||
axis([0 nConst-1 0 1.1*max(symstat_err_mag)]);
|
||||
title('Symbol Magnitude Error');
|
||||
grid;
|
||||
|
||||
subplot(3,1,3),
|
||||
bar(0:nConst-1, symstat_err_phi);
|
||||
axis([0 nConst-1 0 1.1*max(symstat_err_phi)]);
|
||||
title('Symbol Phase Error');
|
||||
xlabel('Symbol');
|
||||
ylabel('rad');
|
||||
grid;
|
||||
|
||||
if(plot_psd == 1)
|
||||
figure;
|
||||
lenI = length(I);
|
||||
lenQ = length(Q);
|
||||
lenI_fft = length(fix(lenI/2):fix(3*lenI/4));
|
||||
lenQ_fft = length(fix(lenQ/2):fix(3*lenQ/4));
|
||||
lenI_f = fix(lenI_fft/2);
|
||||
lenQ_f = fix(lenQ_fft/2);
|
||||
I_f = 1/sqrt(lenI_fft)*abs(fft(I(fix(lenI/2):fix(3*lenI/4))));
|
||||
Q_f = 1/sqrt(lenQ_fft)*abs(fft(Q(fix(lenQ/2):fix(3*lenQ/4))));
|
||||
plot(fa*(0:lenI_f-1)/lenI_fft, 10*log10(I_f(1:lenI_f).^2),fa*(0:lenQ_f-1)/lenQ_fft, 10*log10(Q_f(1:lenQ_f).^2));
|
||||
title('Power Spectral Density of baseband before arm filters');
|
||||
xlabel('f');
|
||||
ylabel('dB');
|
||||
legend('I-Channel','Q-Channel');
|
||||
grid;
|
||||
|
||||
figure;
|
||||
lenIF = length(IF);
|
||||
lenQF = length(QF);
|
||||
lenIF_fft = length(fix(lenIF/2):fix(3*lenIF/4));
|
||||
lenQF_fft = length(fix(lenQF/2):fix(3*lenQF/4));
|
||||
lenIF_f = fix(lenIF_fft/2);
|
||||
lenQF_f = fix(lenQF_fft/2);
|
||||
IF_f = 1/sqrt(lenIF_fft)*abs(fft(IF(fix(lenIF/2):fix(3*lenIF/4))));
|
||||
QF_f = 1/sqrt(lenQF_fft)*abs(fft(QF(fix(lenQF/2):fix(3*lenQF/4))));
|
||||
plot(fa*(0:lenIF_f-1)/lenIF_fft, 10*log10(IF_f(1:lenIF_f).^2),fa*(0:lenQF_f-1)/lenQF_fft, 10*log10(QF_f(1:lenQF_f).^2));
|
||||
title('Power Spectral Density of baseband after arm filters');
|
||||
xlabel('f');
|
||||
ylabel('dB');
|
||||
legend('I-Channel','Q-Channel');
|
||||
grid;
|
||||
|
||||
figure;
|
||||
lenIRCF = length(IRCF);
|
||||
lenQRCF = length(QRCF);
|
||||
lenIRCF_fft = length(fix(lenIRCF/2):fix(3*lenIRCF/4));
|
||||
lenQRCF_fft = length(fix(lenQRCF/2):fix(3*lenQRCF/4));
|
||||
lenIRCF_f = fix(lenIRCF_fft/2);
|
||||
lenQRCF_f = fix(lenQRCF_fft/2);
|
||||
IRCF_f = 1/sqrt(lenIRCF_fft)*abs(fft(IRCF(fix(lenIRCF/2):fix(3*lenIRCF/4))));
|
||||
QRCF_f = 1/sqrt(lenQRCF_fft)*abs(fft(QRCF(fix(lenQRCF/2):fix(3*lenQRCF/4))));
|
||||
plot(fa*(0:lenIRCF_f-1)/lenIRCF_fft, 10*log10(IRCF_f(1:lenIRCF_f).^2),fa*(0:lenQRCF_f-1)/lenQRCF_fft, 10*log10(QRCF_f(1:lenQRCF_f).^2));
|
||||
title('Power Spectral Density of baseband after matched filters');
|
||||
xlabel('f');
|
||||
ylabel('dB');
|
||||
legend('I-Channel','Q-Channel');
|
||||
grid;
|
||||
end;
|
||||
|
||||
end;
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
% rx(cfg_file, mode)
|
||||
%
|
||||
|
||||
function rx(name, mode)
|
||||
cfg_file = [name '.cfg'];
|
||||
|
||||
fid = fopen(cfg_file, 'r');
|
||||
|
||||
[str] = FGETL(fid);
|
||||
name = sscanf(str, 'project :%s');
|
||||
[str] = FGETL(fid);
|
||||
fa = sscanf(str, 'fa :%f');
|
||||
[str] = FGETL(fid);
|
||||
fc = sscanf(str, 'fc :%f');
|
||||
[str] = FGETL(fid);
|
||||
sr = sscanf(str, 'sr :%f');
|
||||
[str] = FGETL(fid);
|
||||
nBitsPerSym = sscanf(str, 'nBitsPerSym :%f');
|
||||
|
||||
fclose(fid);
|
||||
|
||||
commandStr = sprintf('mpsk_rx\\mpsk_rx.exe %g %g %g %d %s %s',fa,fc,sr, nBitsPerSym, mode, name);
|
||||
|
||||
disp(commandStr);
|
||||
dos(commandStr);
|
||||
|
||||
dat2wav([name '_perr'], 2*sr, 16, 0.95);
|
||||
dat2wav([name '_domega'], 2*sr, 16, 0.95);
|
||||
dat2wav([name '_i'], fa, 16, 0.95);
|
||||
dat2wav([name '_q'], fa, 16, 0.95);
|
||||
dat2wav([name '_if'], fa, 16, 0.95);
|
||||
dat2wav([name '_qf'], fa, 16, 0.95);
|
||||
dat2wav([name '_ircf'], 2*sr, 16, 0.95);
|
||||
dat2wav([name '_qrcf'], 2*sr, 16, 0.95);
|
||||
dat2wav([name '_ircf_rm'], 2*sr, 16, 0.95);
|
||||
dat2wav([name '_qrcf_rm'], 2*sr, 16, 0.95);
|
||||
dat2wav([name '_cma_i'], 2*sr, 16, 0.95);
|
||||
dat2wav([name '_cma_q'], 2*sr, 16, 0.95);
|
||||
|
||||
%result_rx(name);
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
% [IQ] = rx_mpsk(fa, mode, nBitsPerSym, sr, fc, name)
|
||||
%
|
||||
|
||||
function [IQ] = rx_mpsk(fa, mode, nBitsPerSym, sr, fc, name)
|
||||
|
||||
commandStr = sprintf('mpsk_rx\\mpsk_rx.exe %g %g %g %d %s %s',fa,fc,sr, nBitsPerSym, mode, name);
|
||||
|
||||
disp(commandStr);
|
||||
dos(commandStr);
|
||||
|
||||
dat2wav([name '_i'], fa, 16, 0.99);
|
||||
dat2wav([name '_q'], fa, 16, 0.99);
|
||||
dat2wav([name '_if'], fa, 16, 0.99);
|
||||
dat2wav([name '_qf'], fa, 16, 0.99);
|
||||
dat2wav([name '_ircf'], 2*sr, 16, 0.99);
|
||||
dat2wav([name '_qrcf'], 2*sr, 16, 0.99);
|
||||
dat2wav([name '_ircf_rm'], 2*sr, 16, 0.99);
|
||||
dat2wav([name '_qrcf_rm'], 2*sr, 16, 0.99);
|
||||
dat2wav([name '_perr'], 2*sr, 16, 0.99);
|
||||
dat2wav([name '_domega'], 2*sr, 16, 0.99);
|
||||
dat2wav([name '_cma_i'], 2*sr, 16, 0.99);
|
||||
dat2wav([name '_cma_q'], 2*sr, 16, 0.99);
|
||||
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
function [xmin, xmax] = sliding_minmax_eval(xin, L)
|
||||
|
||||
x = [1E12*ones(L,1)' xin']';
|
||||
for k=1:(lge(x)-L)
|
||||
for ll=1:L
|
||||
xmin(k) = min(x(1+k:L+k));
|
||||
end
|
||||
end
|
||||
x = [-1E12*ones(L,1)' xin']';
|
||||
for k=1:(lge(x)-L)
|
||||
for ll=1:L
|
||||
xmax(k) = max(x(1+k:L+k));
|
||||
end
|
||||
end
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
function test (N)
|
||||
|
||||
h1 = sinc((-N/2:N/2-1)/77).*hann(N)';
|
||||
h2 = sinc((-N/2:N/2-1)/100).*hann(N)';
|
||||
|
||||
h1 = zeros(1,N);
|
||||
h1(N/2+1) = 0.5;
|
||||
|
||||
v1 = sum((h1))
|
||||
|
||||
h2p = [h2 zeros(1,N/2)];
|
||||
h12 = filter(h1,1,h2p);
|
||||
|
||||
plot(1:N, h12(N/2+1:N+N/2)/v1, 1:N, h1, 1:N, h2)
|
||||
grid;
|
||||
|
||||
Executable
+76
@@ -0,0 +1,76 @@
|
||||
% [IQ] = tx_mpsk(nBytes, nBitsPerSym, sr, fc, name, kawgn_db, ch, rs)
|
||||
%
|
||||
|
||||
function [IQ] = tx_mpsk(nBytes, nBitsPerSym, sr, fc, name, kawgn_db, ch, rs, payload)
|
||||
if fc > sr
|
||||
fa = 4*fc
|
||||
else
|
||||
fa = 4*sr;
|
||||
end;
|
||||
k_am = 0.0;
|
||||
f_am = 0.2;
|
||||
rf_gain = 0.7;
|
||||
|
||||
% Write settings file
|
||||
fid = fopen([name '.cfg'], 'w');
|
||||
fprintf(fid, 'project : %s\n', name);
|
||||
fprintf(fid, 'fa : %f\n', fa);
|
||||
fprintf(fid, 'fc : %f\n', fc);
|
||||
fprintf(fid, 'sr : %f\n', sr);
|
||||
fprintf(fid, 'nBitsPerSym : %d\n', nBitsPerSym);
|
||||
fprintf(fid, 'ch : %d\n', ch);
|
||||
fprintf(fid, 'rs : %d\n', rs);
|
||||
fprintf(fid, 'kawgn_db : %d\n', kawgn_db);
|
||||
fclose(fid);
|
||||
|
||||
name_rf = sprintf('%s_rf',name);
|
||||
name_i = sprintf('%s_tx_i',name);
|
||||
name_q = sprintf('%s_tx_q',name);
|
||||
file_rf = sprintf('%s.dat',name_rf);
|
||||
file_i = sprintf('%s.dat',name_i);
|
||||
file_q = sprintf('%s.dat',name_q);
|
||||
|
||||
if (isempty(payload))
|
||||
commandStr = sprintf('mpsk_tx\\mpsk_tx.exe %g %g %g %d %d %s',fa,fc,sr, nBitsPerSym, nBytes, name);
|
||||
else
|
||||
commandStr = sprintf('mpsk_tx\\mpsk_tx.exe %g %g %g %d %d %s %s',fa,fc,sr, nBitsPerSym, nBytes, name, payload);
|
||||
end
|
||||
|
||||
disp(commandStr);
|
||||
dos(commandStr);
|
||||
|
||||
fid = fopen(file_rf, 'rb');
|
||||
rfdata = fread(fid, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
dat2wav(name_i, fa, 16, 0.9);
|
||||
dat2wav(name_q, fa, 16, 0.9);
|
||||
|
||||
if (rs==1)
|
||||
rfdata = RESAMPLE(rfdata,fa,fix(1.002*fa));
|
||||
end;
|
||||
|
||||
len = length(rfdata);
|
||||
kawgn = 10^(kawgn_db/10)
|
||||
awgn = sqrt(kawgn)*randn(len,1);
|
||||
am = cos(2*pi*f_am/fa.*(0:len-1))';
|
||||
|
||||
if (ch==1)
|
||||
hch_a = [1.0 0.7];
|
||||
hch_b = [1];
|
||||
else
|
||||
hch_a = [1.0];
|
||||
hch_b = [1.0];
|
||||
end
|
||||
|
||||
rf = rf_gain.*((1+k_am*am).*filter(hch_b,hch_a,rfdata) + awgn);
|
||||
rf_level = 10*log10(var(rf));
|
||||
SNR_DB = round(rf_level-kawgn_db)
|
||||
|
||||
fid = fopen(file_rf, 'wb');
|
||||
fwrite(fid, rf, 'float32');
|
||||
fclose(fid);
|
||||
|
||||
dat2wav(name_rf, fa, 16, 0.9)
|
||||
disp('Adding Noise to RF...');
|
||||
|
||||
Executable
+37
@@ -0,0 +1,37 @@
|
||||
function [w, idx] = wkaiser(n, b)
|
||||
|
||||
% function [w, idx] = wkaiser(n, b)
|
||||
|
||||
k1 = 1.0/besselizero(b);
|
||||
k2 = 1 - mod(n, 2);
|
||||
ende = fix((n + 1)/2);
|
||||
|
||||
idx = zeros(n, 1);
|
||||
% Calculate window coefficients
|
||||
for k=0:ende-1,
|
||||
tmp = (2*k + k2) / (n - 1.0);
|
||||
tmp2 = k1 * besselizero(b*sqrt(1.0 - tmp*tmp));
|
||||
mm = ende-(mod(not(k2), 2))+k+1;
|
||||
nn = ende-k;
|
||||
w(mm) = tmp2;
|
||||
w(nn) = tmp2;
|
||||
idx(nn) = idx(nn) + 1;
|
||||
idx(mm) = idx(mm) + 1;
|
||||
end;
|
||||
|
||||
function sum = besselizero(x)
|
||||
BIZ_EPSILON = 1E-21; % Max error acceptable
|
||||
sum = 1.0;
|
||||
u = 1.0;
|
||||
halfx = x/2.0;
|
||||
n = 1;
|
||||
while(1)
|
||||
temp = halfx/n;
|
||||
u = u * temp * temp;
|
||||
sum = sum + u;
|
||||
n = n + 1;
|
||||
if (u < (BIZ_EPSILON * sum))
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
Reference in New Issue
Block a user