-
Notifications
You must be signed in to change notification settings - Fork 0
/
ofdmTX1024Char_Audio.m
176 lines (109 loc) · 2.88 KB
/
ofdmTX1024Char_Audio.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
clc;
clear all
close all
fs = 8e3; % sample rate of ofdm signal
% create chirp signal for sync
N = 8000; %number of samples for chirp sync pulse
t = [0:(N-1)]/fs;
f0 = 300;
f1 = 3000;
T = N/fs;
c = (f1 - f0)/T;
x = (c/2)*t.^2 + f0*t;
pream = sin(2*pi*x);
pream = pream / max(pream);
% samples from sync pulse to ofdm data
guardN = 512;
% time vector
td = 5;
tdsamples = round(td * fs);
tdvec = zeros(1,tdsamples);
Nchar = 1024; % make power of 2, number of char for text
bits = Nchar * 8;
Gbins = 512; % guard fft bins
G2 = round(Gbins/2); % guard fft bins on each side of spectrum
fftsize = 1024;
bitsperfft = fftsize - Gbins;
Nfftblocks = ceil ( bits / bitsperfft);
% get message from txt file
fid = fopen('C:\SDR_Work\textfile.txt');
mtxt = fread(fid);
fclose(fid);
mtxt = mtxt';
if length(mtxt) >= Nchar
mtxt = mtxt(1:Nchar);
disp('text file greater char limit')
else
z = length(mtxt);
z = Nchar - z;
mtxt = [mtxt zeros(1,z)];
disp('textfile under char limit')
end
mbits = dec2bin(mtxt,8);
mbits = reshape(mbits',1,[]);
mbits = mbits(1:bits);
txbits = zeros(1,bits);
for k = 1:bits
if mbits(k) == '1'
txbits(k) = 1;
else
txbits(k) = -1;
end
end
txbits = reshape(txbits,bitsperfft,[]);
txbits = txbits';
[nblocks,nbits] = size(txbits);
% make pilot vector
xp = randn(1,fftsize);
xp = xp / max(xp);
xp = xp * 13;
xp = 2 * pi * xp;
% pilot vector with guard on each side
xp = exp(1i*xp);
xp(1:G2) = 0;
xp(end-(G2-1):end) = 0;
% make data matrix bpsk, 1 = 1, 0 = -1
xd = [zeros(nblocks,G2) txbits zeros(nblocks,G2) ]; % guard on each side
for k = 1:nblocks
if k == 1
%relate data vector to pilot vector
xd(1,:) = xp .* xd(1,:); % e^a * e^b = e^(a + b)
else
xd(k,:) = xd(k-1,:) .* xd(k,:);
end
end
% make data be real: conj and symetric
xp1 = conj( xp(end:-1:2) );
xp = [xp1 xp];
xd1 = conj( xd(:,end:-1:2) );
xd = [xd1 xd];
[nblock,fftsamples] = size(xd);
% pilot time vector
xp = ifftshift(xp);
xp = ifft(xp);
xp = xp / max(abs(xp));
% data time matrix
xd = ifftshift(xd,2);
xd = ifft(xd,[],2);
xdtx = zeros(nblock,2*fftsamples );
% repeat data blocks twice for cyclic prefix
for k = 1:nblock
xdtx(k,:) = [ xd(k,:) xd(k,:) ];
end
xdtx = reshape(xdtx.',1,[]); % 1xN
xdtx = xdtx / max(abs(xdtx));
% put the whole movie together
xz = zeros(1,guardN);
xt = [tdvec pream xz xp xp xdtx tdvec];
% ensure bandwidth, reduce out of band signals
hlpf = fir1(64,0.85);
xt = filter(hlpf,1,xt);
xt = xt / max(abs(xt)); % 1xN
figure()
plot(real(xt))
hold on
plot(imag(xt))
hold off
datafile = [ real(xt).' ];
audiowrite('c:\SDR_Work\ofdmtest1024Char8khzAudio.wav',datafile,fs,'BitsPerSample',16);
%