- removed fill member

[RX]
- added plot_mode as string for real time plot mode. 'h_pilots', 'h_syms' and 'fac' are available.
- fixed finish condition for main loop

git-svn-id: http://moon:8086/svn/matlab/trunk@79 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
2015-05-04 06:39:46 +00:00
parent 5b55fda090
commit 50ca3b4b80
2 changed files with 63 additions and 62 deletions
+2 -3
View File
@@ -1,6 +1,6 @@
function [buf] = buffer()
buf = struct('mem', [], 'ri', 0, 'wi', 0, 'fill', 0, 'obj', @()obj_(), 'len', @()len_(), 'read', @(len)read_(len), 'readAt', @(len, offset)readAt_(len, offset), 'setReadIndex', @(offset)setReadIndex_(offset), 'write', @(x)write_(x));
buf = struct('mem', [], 'ri', 0, 'wi', 0, 'obj', @()obj_(), 'len', @()len_(), 'read', @(len)read_(len), 'readAt', @(len, offset)readAt_(len, offset), 'setReadIndex', @(offset)setReadIndex_(offset), 'write', @(x)write_(x));
function b = obj_()
b = buf;
@@ -36,8 +36,7 @@ function [buf] = buffer()
function write_(x)
len = length(x);
buf.mem(buf.wi+1:buf.wi+len,:) = x;
buf.fill = buf.fill + len;
buf.mem(buf.wi+1:buf.wi+len, :) = x;
buf.wi = buf.wi + len;
end
+61 -59
View File
@@ -1,6 +1,6 @@
function ofdm_rx(filename, foff, flip_spec, SNR, show_H)
function ofdm_rx(filename, foff, flip_spec, SNR, plot_mode)
%
% [sym_out, H, W] = ofdm_rx(filename, foff, flip_spec, SNR, show_H)
% [sym_out, H, W] = ofdm_rx(filename, foff, flip_spec, SNR, plot_mode)
% Example: ofdm_rx('drm-15435-if.wav', -174.65, 0, 400, 1)
% Example: ofdm_rx('xv.wav', 0, 0, 400, 1)
% or ofdm_rx('yv.wav', 0, 0, 400, 1)
@@ -71,12 +71,10 @@ if (wav_numCh == 1)
fprintf('Mode: Passband\n');
isModePassband = 1;
fs = fix(wav_fs/4);
fileChunkSize = N; % Fix: don't leave loop, if file has been consumed. There may be samples left in buf_recv to process
elseif (wav_numCh == 2)
fprintf('Mode: Baseband\n');
fs = wav_fs;
fileChunkSize = N/4; % Fix: don't leave loop, if file has been consumed. There may be samples left in buf_recv to process
else
error('Cannot read file');
end
@@ -100,6 +98,7 @@ frameTiming = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'kc_ma
% Equalization stuff
equalizer = struct('Z', 0, 'started', 0, 'sync_counter', 20, 'sync', 0, 'sync_frame_num', 0, 'f_err', 1000, 'f_err_', [], 's', 0, 'm', 0, 'kk', 1, 'eps_abs_h', MIN_ABS_H);
fileChunkSize = N;
fileCunkCounter = 0;
phi_mix = 0;
phi_foff = 0;
@@ -116,37 +115,39 @@ buf_Z = buffer();
% --------------------------------------------------------------
% Main loop
% --------------------------------------------------------------
while(fileRemain > fileChunkSize) % ToDo: don't leave loop, if file has been consumed. There may be samples left in buf_recv to process
while((fileRemain > fileChunkSize) | (buf_Z.len() > N)) % ToDo: don't leave loop, if file has been consumed. There may be samples left in buf_recv to process
n0 = fileCunkCounter*fileChunkSize+1;
n1 = (fileCunkCounter+1)*fileChunkSize;
[wav_x] = wavread(filename, [n0 n1]);
if (~isModePassband)
wav_x = wav_x(:, 1) + j*wav_x(:, 2);
x = wav_x; % ToDo: Remove DC
x = x.*exp(-j*(2*pi*(-foff/fs)*(0:length(x)-1)' + phi_foff));
phi_foff = mod(phi_foff + 2*pi*(-foff/fs)*length(x), 2*pi);
end
if (fileRemain > fileChunkSize)
n0 = fileCunkCounter*fileChunkSize+1;
n1 = (fileCunkCounter+1)*fileChunkSize;
[wav_x] = wavread(filename, [n0 n1]);
if (isModePassband)
x = wav_x - mean(wav_x); % ToDo: Remove DC
x = x .*exp(-j*(2*pi*(0.25-foff/wav_fs)*(0:length(x)-1)' + phi_mix));
phi_mix = mod(phi_mix + 2*pi*(0.25-foff/wav_fs)*length(x), 2*pi);
[x, filter_z] = filter(filter_h, 1, x, filter_z);
x = x(1:4:length(x));
end
if (~isModePassband)
wav_x = wav_x(:, 1) + j*wav_x(:, 2);
x = wav_x; % ToDo: Remove DC
x = x.*exp(-j*(2*pi*(-foff/fs)*(0:length(x)-1)' + phi_foff));
phi_foff = mod(phi_foff + 2*pi*(-foff/fs)*length(x), 2*pi);
end
if flip_spec
x = conj(x);
if (isModePassband)
x = wav_x; % ToDo: Remove DC
x = x .*exp(-j*(2*pi*(0.25-foff/wav_fs)*(0:length(x)-1)' + phi_mix));
phi_mix = mod(phi_mix + 2*pi*(0.25-foff/wav_fs)*length(x), 2*pi);
[x, filter_z] = filter(filter_h, 1, x, filter_z);
x = x(1:4:length(x));
end
if flip_spec
x = conj(x);
end
% add noise
x = awgn(x, SNR);
% Write to buffer
buf_recv.write(x);
end
% add noise
x = awgn(x, SNR);
% Write to buffer
buf_recv.write(x);
% --------------------------------------------------------------
% Timing coarse
if (~timingCoarse.sync)
@@ -363,7 +364,7 @@ while(fileRemain > fileChunkSize) % ToDo: don't leave loop, if file has been con
% equalize symbol
sym_eq = sym ./ H_syms;
if 0
if strcmpi(plot_mode, 'h_pilots')
subplot(2, 1, 1)
plot(1:length(Hr), abs(Hr), 'b-', 1:length(H_pilots), abs(H_pilots), 'r-'); grid;
subplot(2, 1, 2)
@@ -371,35 +372,34 @@ while(fileRemain > fileChunkSize) % ToDo: don't leave loop, if file has been con
title(str);
pause(0.01);
end
if 1
if show_H
max_H_plot = ceil(max(max_H_plot, max(abs(H_raw(2:2:N)))));
H_raw(1:2:N) = H_raw(2:2:N);
subplot(3, 1, 1)
plot(carriers, abs(H_raw(carrier_indexes)), 'b-', carriers, abs(H_syms), 'r-'); grid; title('abs(H_{syms})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 max_H_plot]); title(str);
subplot(3, 1, 2)
plot(carriers, angle(H_raw(carrier_indexes)), 'b-', carriers, angle(H_syms), 'r-'); grid; title('phi(H_{syms})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax -4 4]); title(str);
subplot(3, 1, 3)
plot(carriers, abs(sym_eq), 'b-'); grid; title('abs(Sym_{Eq})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 2]); title(str);
hold on;
for b=c2i(N, carrier_pilot)
x = [b b];
y = [0 2];
plot(x-1,y, 'r-');
end
hold off;
if strcmpi(plot_mode, 'h_syms')
max_H_plot = ceil(max(max_H_plot, max(abs(H_raw(2:2:N)))));
H_raw(1:2:N) = H_raw(2:2:N);
subplot(3, 1, 1)
plot(carriers, abs(H_raw(carrier_indexes)), 'b-', carriers, abs(H_syms), 'r-'); grid; title('abs(H_{syms})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 max_H_plot]); title(str);
subplot(3, 1, 2)
plot(carriers, angle(H_raw(carrier_indexes)), 'b-', carriers, angle(H_syms), 'r-'); grid; title('phi(H_{syms})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax -4 4]); title(str);
subplot(3, 1, 3)
plot(carriers, abs(sym_eq), 'b-'); grid; title('abs(Sym_{Eq})'); axis([ofdm_spec_occ.kmin ofdm_spec_occ.kmax 0 2]); title(str);
hold on;
for b=c2i(N, carrier_pilot)
x = [b b];
y = [0 2];
plot(x-1,y, 'r-');
end
hold off;
pause(0.01);
end
if strcmpi(plot_mode, 'fac') & (equalizer.sync)
fac_c = fac_cell_list{mod(equalizer.s-symbols_to_delay, symbols_per_frame)+1};
if (~isempty(fac_c))
fac_i = fac_c - ofdm_spec_occ.kmin + 1;
hold on;
plot(sym_eq(fac_i), '+', 'MarkerSize', 4);
pause(0.01);
elseif (equalizer.sync)
fac_c = fac_cell_list{mod(equalizer.s-symbols_to_delay, symbols_per_frame)+1};
if (~isempty(fac_c))
fac_i = fac_c - ofdm_spec_occ.kmin + 1;
hold on;
plot(sym_eq(fac_i), '+', 'MarkerSize', 4);
pause(0.01);
grid; title('FAC'); axis([-1 1 -1 1]);
hold off;
end
grid; title('FAC'); axis([-1 1 -1 1]);
hold off;
end
end
end
@@ -467,9 +467,11 @@ xup = filter(hlp, 1, xup);
y = exp(j*2*pi.*(0:length(xup)-1)'*0.25) .* xup;
fprintf('.');
wavwrite(y,4*fs,nbits,'rx_y.wav');
tt = equalizer.f_err_ ./ max(abs(equalizer.f_err_));
wavwrite(0.8*tt,fs/8,nbits,'rx_cfo_err.wav');
fprintf(' done\n');
% --------------------------------------------------------------
function Y = spec_order(N, X)
Y = [X(N/2+1:N)' X(1:N/2)']';