Skip to content

Commit 56104d0

Browse files
committed
fft base fast xcorr is done. see fft_corr.m
1 parent f2eaeb7 commit 56104d0

5 files changed

+97
-12
lines changed

Matlab/CellSearch.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
disp(['Input averaged abs: ' num2str( mean(abs([real(capbuf_pbch) imag(capbuf_pbch)])) )]);
5858

5959
disp('sampling_ppm_f_search_set_by_pss: try ... ... ');
60-
[period_ppm, dynamic_f_search_set, xc, ~, ~, ~, ~, extra_info] = sampling_ppm_f_search_set_by_pss(capbuf_pbch.', f_search_set, pss_fo_set, sampling_carrier_twist, pss_peak_max_reserve, num_pss_period_try, combined_pss_peak_range, par_th, num_peak_th);
60+
[period_ppm, dynamic_f_search_set, xc, ~, ~, ~, ~, extra_info] = sampling_ppm_f_search_set_by_pss(capbuf_pbch.', f_search_set, td_pss, pss_fo_set, sampling_carrier_twist, pss_peak_max_reserve, num_pss_period_try, combined_pss_peak_range, par_th, num_peak_th);
6161
if sampling_carrier_twist==0
6262
if period_ppm == inf
6363
disp('No valid PSS is found at pre-proc phase! Please try again.');

Matlab/fft_corr.m

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
function [corr_store, fo_search_set_new] = fft_corr(s, td_pss, fo_search_set)
2+
% % s column vectors -- 153600
3+
% % td_pss column vectors
4+
% % fo_search_set row vectors
5+
6+
fo_search_set_new = fo_search_set; % it happens to be equal, because 1.92e6/153600 = 12.5Hz under 5kHz step size
7+
sampling_rate = 1.92e6;
8+
9+
len = length(s);
10+
11+
freq_step = sampling_rate/len;
12+
13+
len_pss = size(td_pss, 1);
14+
num_pss = size(td_pss, 2);
15+
num_fo = length(fo_search_set);
16+
num_fo_pss = num_fo*num_pss;
17+
% len_short = len - (len_pss-1);
18+
19+
corr_store = zeros(len, num_fo_pss);
20+
21+
s = fft(s);
22+
fd_pss = fft(conj(td_pss(end:-1:1,:)./len_pss), len, 1);
23+
24+
for i = 1 : num_fo_pss
25+
pss_idx = floor((i-1)/num_fo) + 1;
26+
fo_idx = i - (pss_idx-1)*num_fo;
27+
fo = fo_search_set(fo_idx);
28+
fd_fo_shift_len = fo/freq_step;
29+
corr_store(:, i) = s.*circshift(fd_pss(:,pss_idx), [fd_fo_shift_len,0]);
30+
% corr_store(:, i) = abs( ifft(s.*circshift(fd_pss(:,pss_idx), [fd_fo_shift_len,0]), [], 1) ).^2;
31+
% corr_store(:, i) = real( corr_store(:, i).*conj(corr_store(:, i)) );
32+
end
33+
corr_store = abs( ifft(corr_store, len, 1) ).^2;
34+
corr_store = corr_store(len_pss:end,:);

Matlab/sampling_ppm_f_search_set_by_pss.m

+16-8
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
% Find out LTE PSS in the signal stream and correct sampling&carrier error.
33
% A script of project: https://github.com/JiaoXianjun/rtl-sdr-LTE
44

5-
function [ppm, f_set, xc, fo_idx_set, pss_idx_set, fo_pss_idx_set, fo_with_all_pss_idx, extra_info] = sampling_ppm_f_search_set_by_pss(s, fo_search_set, pss_fo_set, sampling_carrier_twist, max_reserve, num_pss_period_try, combined_pss_peak_range, par_th, num_peak_th)
5+
function [ppm, f_set, xc, fo_idx_set, pss_idx_set, fo_pss_idx_set, fo_with_all_pss_idx, extra_info] = sampling_ppm_f_search_set_by_pss(s, fo_search_set, td_pss, pss_fo_set, sampling_carrier_twist, max_reserve, num_pss_period_try, combined_pss_peak_range, par_th, num_peak_th)
66
% sampling period PPM! not sampling frequency PPM!
77

88
% fo_search_set = -100e3 : 5e3 : 100e3; % -100kHz ~ 100 kHz with 5kHz step size
99
% pss_fo_set = pss_fo_set_gen(td_pss, fo_search_set);
1010

11-
combined_pss_peak_range_half = floor(combined_pss_peak_range/2);
11+
% combined_pss_peak_range_half = floor(combined_pss_peak_range/2);
1212
extra_info = [];
1313

1414
len_pss = size(pss_fo_set, 1);
@@ -17,13 +17,21 @@
1717
len = length(s);
1818
len_short = len - (len_pss-1);
1919

20-
corr_store = zeros(len_short, num_fo_pss);
20+
% corr_store = zeros(len_short, num_fo_pss);
21+
%
22+
% tic;
23+
% for i=1:num_fo_pss
24+
% tmp_corr = abs( filter(pss_fo_set(end:-1:1, i), 1, s) ).^2;
25+
% tmp_corr = tmp_corr(len_pss:end);
26+
% corr_store(:,i) = tmp_corr;
27+
% end
28+
% cost_time1 = toc;
29+
% disp(['PSS xcorr cost ' num2str(cost_time1)]);
2130

22-
for i=1:num_fo_pss
23-
tmp_corr = abs( filter(pss_fo_set(end:-1:1, i), 1, s) ).^2;
24-
tmp_corr = tmp_corr(len_pss:end);
25-
corr_store(:,i) = tmp_corr;
26-
end
31+
tic;
32+
[corr_store, fo_search_set] = fft_corr(s, td_pss, fo_search_set);
33+
cost_time2 = toc;
34+
disp(['PSS xcorr cost ' num2str(cost_time2)]);
2735

2836
if sampling_carrier_twist==1
2937
ppm = inf;

Matlab/test_CellSearch.m

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131

3232
cell_info = cell(1, length(test_source_info));
3333
for i = test_sp : test_ep
34-
if isempty( strfind(test_source_info(i).filename, 'dimitri') )
35-
continue;
36-
end
34+
% if isempty( strfind(test_source_info(i).filename, 'dimitri') )
35+
% continue;
36+
% end
3737
disp(test_source_info(i).filename);
3838
coef_pbch = pbch_filter_coef_gen(test_source_info(i).fs);
3939

Matlab/test_fft_corr.m

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
% function test_fft_corr
2+
clear all;
3+
close all;
4+
[~, td_pss] = pss_gen;
5+
td_pss = td_pss(:,1).';
6+
len_pss = length(td_pss);
7+
8+
fo_search_set = 5e3;
9+
10+
sampling_rate = 1.92e6;
11+
td_pss_fo = td_pss.*exp(1i.*2.*pi.*(1./sampling_rate).*(0:(len_pss-1)).*fo_search_set);
12+
13+
conj_td_pss_fo = conj(td_pss_fo);
14+
15+
len = 153600;
16+
s = randn(1, len) + 1i.*randn(1, len);
17+
18+
freq_step = sampling_rate/len;
19+
20+
shift_len = fo_search_set/freq_step;
21+
22+
fft_conj_td_pss_fo = fft(conj_td_pss_fo, len);
23+
24+
fft_conj_td_pss = fft(conj(td_pss), len);
25+
26+
plot(angle(fft_conj_td_pss_fo)); hold on;
27+
plot(angle(circshift(fft_conj_td_pss, [0, -shift_len])), 'r');
28+
29+
fft_s = fft(s);
30+
31+
% a = filter(conj_td_pss_fo(end:-1:1), 1, s);
32+
% a = conv(s, conj_td_pss_fo);
33+
% a(1: len_pss-1) = a(1: len_pss-1) + a(len+1 : end);
34+
a = filter(conj_td_pss_fo, 1, s);
35+
36+
b = ifft( fft_s.*circshift(fft_conj_td_pss, [0, -shift_len]) );
37+
% b = ifft( fft_s.*fft_conj_td_pss_fo );
38+
39+
% b = b(len_pss:end);
40+
41+
figure;
42+
plot(angle(a)); hold on;
43+
plot(angle(b),'r');

0 commit comments

Comments
 (0)