You are absolutely right - the matlab code is attached.
You can get my sample data (local radio station, 3 MBytes) from
http://www.1c3.de/dab_ml.dat.bz2.

Jens

On Sat, Apr 01, 2006 at 10:27:57AM -0500, Robert McGwier wrote:
> Why don't you allow us to provide you with help based on the reality as 
> opposed to conjecture.  Post your matlab scripts.  This "remote viewing" 
> exercise is inefficient.
> 
> 
> Bob
> 
> 
> 
> Jens Elsner wrote:
> >I resampled all the data to do a proof-of-concept. The frames are only a
> >small part
> >of the "chunk" variable. What I am getting is a fairly nice pi/4 DPSK.
> >Only that
> >in between OFDM Symbols (there are 76 in a frame) there is some sort of
> >random
> >phase jitter. And I am clueless what it could be. Frequency offset is
> >compensated,
> >the channel doesnt vary that fast.
> >
> >Jens
> >
> >  
> 
> 
> -- 
> AMSAT VP Engineering. Member: ARRL, AMSAT-DL, TAPR, Packrats,
> NJQRP/AMQRP, QRP ARCI, QCWA, FRC. ARRL SDR Wrk Grp Chairman
> Laziness is the number one inspiration for ingenuity.  Guilty as charged!
> 
clear all;
close all;

% dab.dat contains data sampled from the USRP 2 MHz (decimation factor 32)

fid = fopen('dab_ml.dat', 'r');
%skip 50000 samples - bug in gnuradio?
d = fread(fid, 50000, 'float32');

%read real
d_re = fread(fid, 1000000, 'float32',4);
fclose(fid);

fid = fopen('dab_ml.dat', 'r');
%skip 50001 samples - bug in gnuradio?
d = fread(fid, 50001, 'float32');

%read imag
d_im = fread(fid, 1000000, 'float32', 4);
fclose(fid);

e = d_re + j*d_im;
clear d*

% not all data need, file too big
chunk = e(1:700000);

% Generate phase reference symbol, frequency domain
p = prs;

% resampling
chunk_resamp = resample(chunk, 2048, 2000);

% this code is used to look for the synch frame manually
if 1==0

glob_max = 0;
for k = 3.6*10^5:length(chunk_resamp)
    data = chunk_resamp(k:k+2048);
    f = fftshift(fft(data,2048));

    xc = abs(xcorr(p,f));

    [m offset] = max(xc);
    if m > 10^7
        disp('found synch frame');
        plot(xc);
        axis([0 4000 0 2*10^7]);
        drawnow
        pause
        k
    end
    if m > glob_max
        offset_max = offset
        glob_max = m
        glob_max_k = k
        plot(xc);
        axis([0 4000 0 2*10^7]);
        drawnow
        %pause
    end    
    drawnow
end

end

% decode one frame (75 symbols + synch symbol)
for o = 0:75

% start of frame, found manually
start_resamp = 168988;
    
%get the data for one OFDM symbol (2048 samples), skip guard intervall (504
%samples)
data_resamp = 
chunk_resamp(start_resamp+(504+2048)*o:start_resamp+2048-1+(504+2048)*o);

% compensate frequency offset - done manually
data2_resamp = 
data_resamp.*exp(j*linspace(0,2*pi*(0.385-8),length(data_resamp)).');

% fft to decode data
d_resamp = fftshift(fft(data2_resamp,2048));

% only 1536 subcarriers + DC carrier to display
data = d_resamp(256:1792);

% first OFDM symbol is used for synchronization - no data.
if o == 0
    plot(abs(d_resamp).^2);    
    drawnow
    pause
end

% display decoded data symbols, including DC carrier
if o ~= 0
    dem = data ./ data_l;

    plot(real(dem), imag(dem), 'o');   
    axis([-3 3 -3 3]);

    drawnow
   
    pause
end

% DAB uses pi/4 DPSK, last frame is reference
data_l = data;

    
end

function z = prs

% Generate phase reference symbol

%DAB standard, table 39, pp. 148
K = 1536;

% k = k', i, n
t39 = zeros(1536,3);
o = K/2+1;

for k = -768:-737
    t39(k+o:k+o,:,:) = [-768,0,1];
end

for k = -736:-705
    t39(k+o:k+o,:,:) = [-736,1,2];
end

for k = -704:-673
    t39(k+o:k+o,:,:) = [-704,2,0];
end

for k = -672:-641
    t39(k+o:k+o,:,:) = [-672,3,1];
end

for k = -640:-609
    t39(k+o:k+o,:,:) = [-640,0,3];
end

for k = -608:-577
    t39(k+o:k+o,:,:) = [-608,1,2];
end

for k = -576:-545
    t39(k+o:k+o,:,:) = [-576,2,2];
end

for k = -544:-513
    t39(k+o:k+o,:,:) = [-544,3,3];
end

for k = -512:-481
    t39(k+o:k+o,:,:) = [-512,0,2];
end

for k = -480:-449
    t39(k+o:k+o,:,:) = [-480,1,1];
end

for k = -448:-417
    t39(k+o:k+o,:,:) = [-448,2,2];
end

for k = -416:-385
    t39(k+o:k+o,:,:) = [-416,3,3];
end

for k = -384:-353
    t39(k+o:k+o,:,:) = [-384,0,1];
end

for k = -352:-321
    t39(k+o:k+o,:,:) = [-352,1,2];
end

for k = -320:-289
    t39(k+o:k+o,:,:) = [-320,2,3];
end

for k = -288:-257
    t39(k+o:k+o,:,:) = [-288,3,3];
end

for k = -256:-225
    t39(k+o:k+o,:,:) = [-256,0,2];
end

for k = -224:-193
    t39(k+o:k+o,:,:) = [-224,1,2];
end

for k = -192:-161
    t39(k+o:k+o,:,:) = [-192,2,2];
end

for k = -160:-129
    t39(k+o:k+o,:,:) = [-160,3,1];
end

for k = -128:-97
    t39(k+o:k+o,:,:) = [-128,0,1];
end

for k = -96:-65
    t39(k+o:k+o,:,:) = [-96,1,3];
end

for k = -64:-33
    t39(k+o:k+o,:,:) = [-64,2,1];
end

for k = -32:-1
    t39(k+o:k+o,:,:) = [-32,3,2];
end

for k = 0:0
    t39(k+o:k+o,:,:) = [0, 0, 0];
end    

for k = 1:32
    t39(k+o:k+o,:,:) = [1,0,3];
end

for k = 33:64
    t39(k+o:k+o,:,:) = [33,3,1];
end

for k = 65:96
    t39(k+o:k+o,:,:) = [65,2,1];
end

for k = 97:128
    t39(k+o:k+o,:,:) = [97,1,1];
end

for k = 129:160
    t39(k+o:k+o,:,:) = [129,0,2];
end

for k = 161:192
    t39(k+o:k+o,:,:) = [161,3,2];
end

for k = 193:224
    t39(k+o:k+o,:,:) = [193,2,1];
end

for k = 225:256
    t39(k+o:k+o,:,:) = [225,1,0];
end

for k = 257:288
    t39(k+o:k+o,:,:) = [257,0,2];
end

for k = 289:320
    t39(k+o:k+o,:,:) = [289,3,2];
end

for k = 321:352
    t39(k+o:k+o,:,:) = [321,2,3];
end

for k = 353:384
    t39(k+o:k+o,:,:) = [353,1,3];
end

for k = 385:416
    t39(k+o:k+o,:,:) = [385,0,0];
end

for k = 417:448
    t39(k+o:k+o,:,:) = [417,3,2];
end

for k = 449:480
    t39(k+o:k+o,:,:) = [449,2,1];
end

for k = 481:512
    t39(k+o:k+o,:,:) = [481,1,3];
end

for k = 513:544
    t39(k+o:k+o,:,:) = [513,0,3];
end

for k = 545:576
    t39(k+o:k+o,:,:) = [545,3,3];
end

for k = 577:608
    t39(k+o:k+o,:,:) = [577,2,3];
end

for k = 609:640
    t39(k+o:k+o,:,:) = [609,1,0];
end

for k = 641:672
    t39(k+o:k+o,:,:) = [641,0,3];
end

for k = 673:704
    t39(k+o:k+o,:,:) = [673,3,0];
end

for k = 705:736
    t39(k+o:k+o,:,:) = [705,2,1];
end

for k = 737:768
    t39(k+o:k+o,:,:) = [737,1,1];
end

o=1;
% h(i,j)
h(0+o,0+o) = 0;
h(1+o,0+o) = 0;
h(2+o,0+o) = 0;
h(3+o,0+o) = 0;

h(0+o,1+o) = 2;
h(1+o,1+o) = 3;
h(2+o,1+o) = 0;
h(3+o,1+o) = 1;

h(0+o,2+o) = 0;
h(1+o,2+o) = 2;
h(2+o,2+o) = 0;
h(3+o,2+o) = 2;

h(0+o,3+o) = 0;
h(1+o,3+o) = 3;
h(2+o,3+o) = 2;
h(3+o,3+o) = 1;

h(0+o,4+o) = 0;
h(1+o,4+o) = 0;
h(2+o,4+o) = 0;
h(3+o,4+o) = 0;

h(0+o,5+o) = 0;
h(1+o,5+o) = 1;
h(2+o,5+o) = 2;
h(3+o,5+o) = 3;

h(0+o,6+o) = 1;
h(1+o,6+o) = 3;
h(2+o,6+o) = 1;
h(3+o,6+o) = 3;

h(0+o,7+o) = 1;
h(1+o,7+o) = 0;
h(2+o,7+o) = 3;
h(3+o,7+o) = 2;

h(0+o,8+o) = 2;
h(1+o,8+o) = 2;
h(2+o,8+o) = 2;
h(3+o,8+o) = 2;

h(0+o,9+o) = 0;
h(1+o,9+o) = 1;
h(2+o,9+o) = 2;
h(3+o,9+o) = 3;

h(0+o,10+o) = 0;
h(1+o,10+o) = 2;
h(2+o,10+o) = 0;
h(3+o,10+o) = 2;

h(0+o,11+o) = 0;
h(1+o,11+o) = 3;
h(2+o,11+o) = 2;
h(3+o,11+o) = 1;

h(0+o,12+o) = 2;
h(1+o,12+o) = 2;
h(2+o,12+o) = 2;
h(3+o,12+o) = 2;

h(0+o,13+o) = 2;
h(1+o,13+o) = 3;
h(2+o,13+o) = 0;
h(3+o,13+o) = 1;

h(0+o,14+o) = 1;
h(1+o,14+o) = 3;
h(2+o,14+o) = 1;
h(3+o,14+o) = 3;

h(0+o,15+o) = 1;
h(1+o,15+o) = 0;
h(2+o,15+o) = 3;
h(3+o,15+o) = 2;

h(0+o,16+o) = 0;
h(1+o,16+o) = 0;
h(2+o,16+o) = 0;
h(3+o,16+o) = 0;

h(0+o,17+o) = 2;
h(1+o,17+o) = 3;
h(2+o,17+o) = 0;
h(3+o,17+o) = 1;

h(0+o,18+o) = 0;
h(1+o,18+o) = 2;
h(2+o,18+o) = 0;
h(3+o,18+o) = 2;

h(0+o,19+o) = 0;
h(1+o,19+o) = 3;
h(2+o,19+o) = 2;
h(3+o,19+o) = 1;

h(0+o,20+o) = 0;
h(1+o,20+o) = 0;
h(2+o,20+o) = 0;
h(3+o,20+o) = 0;

h(0+o,21+o) = 0;
h(1+o,21+o) = 1;
h(2+o,21+o) = 2;
h(3+o,21+o) = 3;

h(0+o,22+o) = 1;
h(1+o,22+o) = 3;
h(2+o,22+o) = 1;
h(3+o,22+o) = 3;

h(0+o,23+o) = 1;
h(1+o,23+o) = 0;
h(2+o,23+o) = 3;
h(3+o,23+o) = 2;

h(0+o,24+o) = 2;
h(1+o,24+o) = 2;
h(2+o,24+o) = 2;
h(3+o,24+o) = 2;

h(0+o,25+o) = 0;
h(1+o,25+o) = 1;
h(2+o,25+o) = 2;
h(3+o,25+o) = 3;

h(0+o,26+o) = 0;
h(1+o,26+o) = 2;
h(2+o,26+o) = 0;
h(3+o,26+o) = 2;

h(0+o,27+o) = 0;
h(1+o,27+o) = 3;
h(2+o,27+o) = 2;
h(3+o,27+o) = 1;

h(0+o,28+o) = 2;
h(1+o,28+o) = 2;
h(2+o,28+o) = 2;
h(3+o,28+o) = 2;

h(0+o,29+o) = 2;
h(1+o,29+o) = 3;
h(2+o,29+o) = 0;
h(3+o,29+o) = 1;

h(0+o,30+o) = 1;
h(1+o,30+o) = 3;
h(2+o,30+o) = 1;
h(3+o,30+o) = 3;

h(0+o,31+o) = 1;
h(1+o,31+o) = 0;
h(2+o,31+o) = 3;
h(3+o,31+o) = 2;

o = K/2+1;
for k = -K/2:1:K/2
    if k~=0
        ks = t39(k+o,1,1);
        i = t39(k+o,2,1);
        n = t39(k+o,3,1);
        phi = pi/2 * ((h(i+1,k-ks+1)+n));
        z(k+o) = exp(j * phi);
    end
    if k==0
        z(k+o) = 0;
    end 
end

end
_______________________________________________
Discuss-gnuradio mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to