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