18 #include "../../utils/sequence_generator/sequence_generator.h" 19 #include "../../variables/common_variables/common_variables.h" 55 fftw_complex *pss_in_0 = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
56 fftw_complex *pss_out_0 = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
57 fftw_complex *pss_in_1 = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
58 fftw_complex *pss_out_1 = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
59 fftw_complex *pss_in_2 = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
60 fftw_complex *pss_out_2 = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
65 fftw_plan ifft_plan_0 = fftw_plan_dft_1d(fft_size, pss_in_0, pss_out_0, FFTW_BACKWARD, FFTW_MEASURE);
66 fftw_plan ifft_plan_1 = fftw_plan_dft_1d(fft_size, pss_in_1, pss_out_1, FFTW_BACKWARD, FFTW_MEASURE);
67 fftw_plan ifft_plan_2 = fftw_plan_dft_1d(fft_size, pss_in_2, pss_out_2, FFTW_BACKWARD, FFTW_MEASURE);
72 for (
int i = 0; i < fft_size; i++){
97 for (
int i = 0; i < fft_size/2; i++){
99 pss_in_0[i][0] = pss_0_seq[i + 64];
102 pss_in_1[i][0] = pss_1_seq[i + 64];
105 pss_in_2[i][0] = pss_2_seq[i + 64];
109 pss_in_0[fft_size - i - 1][0] = pss_0_seq[64 - i - 1];
110 pss_in_0[fft_size - i - 1][1] = 0;
112 pss_in_1[fft_size - i - 1][0] = pss_1_seq[64 - i - 1];
113 pss_in_1[fft_size - i - 1][1] = 0;
115 pss_in_2[fft_size - i - 1][0] = pss_2_seq[64 - i - 1];
116 pss_in_2[fft_size - i - 1][1] = 0;
123 fftw_execute(ifft_plan_0);
124 fftw_execute(ifft_plan_1);
125 fftw_execute(ifft_plan_2);
127 vector<complex<float>> time_signal_pss_0(cp_length + fft_size),time_signal_pss_1(cp_length + fft_size),time_signal_pss_2(cp_length + fft_size);
131 for (
int i = 0; i < cp_length + fft_size; i++){
133 time_signal_pss_0[i] = complex<float>(pss_out_0[fft_size - cp_length + i][0], pss_out_0[fft_size - cp_length + i][1]);
135 time_signal_pss_1[i] = complex<float>(pss_out_1[fft_size - cp_length + i][0], pss_out_1[fft_size - cp_length + i][1]);
137 time_signal_pss_2[i] = complex<float>(pss_out_2[fft_size - cp_length + i][0], pss_out_2[fft_size - cp_length + i][1]);
140 time_signal_pss_0[i] = complex<float>(pss_out_0[i - cp_length][0], pss_out_0[i - cp_length][1]);
142 time_signal_pss_1[i] = complex<float>(pss_out_1[i - cp_length][0], pss_out_1[i - cp_length][1]);
144 time_signal_pss_2[i] = complex<float>(pss_out_2[i - cp_length][0], pss_out_2[i - cp_length][1]);
149 size_t num_samples = buff.size();
150 complex<float> corr_0[num_samples + fft_size + cp_length - 1], corr_1[num_samples + fft_size + cp_length - 1], corr_2[num_samples + fft_size + cp_length - 1];
156 thread correlation_thread_0(
cross_correlation, buff,time_signal_pss_0,&corr_0[0],num_samples,fft_size + cp_length);
157 thread correlation_thread_1(
cross_correlation, buff,time_signal_pss_1,&corr_1[0],num_samples,fft_size + cp_length);
158 thread correlation_thread_2(
cross_correlation, buff,time_signal_pss_2,&corr_2[0],num_samples,fft_size + cp_length);
159 correlation_thread_0.join();
160 correlation_thread_1.join();
161 correlation_thread_2.join();
163 float max_value = -1;
165 synchronisation_index = -1;
170 for (
int i = 0; i < num_samples + fft_size + cp_length - 1; i++){
171 float abs_0_short = abs(corr_0[i]);
172 float abs_1_short = abs(corr_1[i]);
173 float abs_2_short = abs(corr_2[i]);
175 if (abs_0_short > max_value){
176 max_value = abs_0_short;
178 synchronisation_index = i;
179 }
else if (abs_1_short > max_value){
180 max_value = abs_1_short ;
182 synchronisation_index = i;
183 }
else if (abs_2_short > max_value){
184 max_value = abs_2_short;
186 synchronisation_index = i;
189 peak_value = max_value;
207 int base_id1, base_id2;
208 for (
int m = 0; m < size1 + size2 - 1; m++){
213 base_id2 = size2 - common;
215 }
else if (m > size1 - 1) {
218 base_id1 = size1 - common;
221 base_id1 = m + 1 - size2;
226 for (
int n = 0; n < common; n++){
227 out[m] += in1[base_id1 + n] * conj(in2[base_id2 + n]);
253 fftw_complex *fft_in = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
254 fftw_complex *fft_out = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
259 fftw_plan fft_plan = fftw_plan_dft_1d(fft_size, fft_in, fft_out, FFTW_FORWARD, FFTW_MEASURE);
264 for (
int i = 0; i < fft_size; i++){
265 fft_in[i][0] = real(buff[i]);
266 fft_in[i][1] = imag(buff[i]);
272 fftw_execute(fft_plan);
279 for (
int i = 0; i < 64; i++){
281 frequency_sss[i + 64] = complex<float>(fft_out[i][0], fft_out[i][1]);
283 frequency_sss[64 - i - 1] = complex<float>(fft_out[fft_size - i - 1][0], fft_out[fft_size - i - 1][1]);
285 float max_value = -1;
287 complex<float> correlation_value;
297 float abs_value = abs(correlation_value);
298 if (abs_value > max_value){
299 max_value = abs_value;
303 peak_value = max_value;
316 complex<float> out = 0;
317 for (
int i = 0; i < size; i ++){
318 out += in1[i] * conj(complex<float>(in2[i],0));
void search_pss(int &n_id_2, int &synchronisation_index, float &peak_value, int cp_length, vector< complex< float >> &buff, int fft_size)
void cross_correlation(vector< complex< float >> in1, vector< complex< float >> in2, complex< float > *out, int size1, int size2)
void generate_sss_sequence(int n_id_1, int n_id_2, int *output_sequence)
void get_sss(int &n_id_1, float &peak_value, vector< complex< float >> &buff, int fft_size, int n_id_2)
complex< float > correlate(vector< complex< float >> in1, int *in2, int size)
void generate_pss_sequence(int n_id_2, int *output_sequence)