diff --git a/ofdm/buffer.m b/ofdm/buffer.m index a248e7f..790dd41 100644 --- a/ofdm/buffer.m +++ b/ofdm/buffer.m @@ -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 diff --git a/ofdm/ofdm_rx.m b/ofdm/ofdm_rx.m index c004fc7..665906e 100644 --- a/ofdm/ofdm_rx.m +++ b/ofdm/ofdm_rx.m @@ -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)']';