[Buffer]
- 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:
+2
-3
@@ -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
@@ -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)']';
|
||||
|
||||
Reference in New Issue
Block a user