diff --git a/cmake/modules/FindLIBSDRGUI.cmake b/cmake/modules/FindLIBSDRGUI.cmake deleted file mode 100644 index 42e8dec76..000000000 --- a/cmake/modules/FindLIBSDRGUI.cmake +++ /dev/null @@ -1,40 +0,0 @@ -# - Try to find LIBSDRGUI -# Once done this will define -# LIBSDRGUI_FOUND - System has libsdrgui -# LIBSDRGUI_INCLUDE_DIRS - The libsdrgui include directories -# LIBSDRGUI_LIBRARIES - The libsdrgui library - -find_package(PkgConfig) -pkg_check_modules(PC_LIBSDRGUI QUIET libsdrgui) -set(LIBSDRGUI_DEFINITIONS ${PC_LIBSDRGUI_CFLAGS_OTHER}) - -FIND_PATH( - LIBSDRGUI_INCLUDE_DIRS - NAMES libsdrgui/libsdrgui.h - HINTS ${PC_LIBSDRGUI_INCLUDEDIR} - ${PC_LIBSDRGUI_INCLUDE_DIRS} - $ENV{LIBSDRGUI_DIR}/include - PATHS /usr/local/include - /usr/include -) - -FIND_LIBRARY( - LIBSDRGUI_LIBRARIES - NAMES sdrgui - HINTS ${PC_LIBSDRGUI_LIBDIR} - ${CMAKE_INSTALL_PREFIX}/lib - ${CMAKE_INSTALL_PREFIX}/lib64 - $ENV{LIBSDRGUI_DIR}/lib - PATHS /usr/local/lib - /usr/local/lib64 - /usr/lib - /usr/lib64 -) - -message(STATUS "LIBSDRGUI LIBRARIES " ${LIBSDRGUI_LIBRARIES}) -message(STATUS "LIBSDRGUI INCLUDE DIRS " ${LIBSDRGUI_INCLUDE_DIRS}) - -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBSDRGUI DEFAULT_MSG LIBSDRGUI_LIBRARIES LIBSDRGUI_INCLUDE_DIRS) -MARK_AS_ADVANCED(LIBSDRGUI_LIBRARIES LIBSDRGUI_INCLUDE_DIRS) - diff --git a/cmake/modules/FindSRSGUI.cmake b/cmake/modules/FindSRSGUI.cmake new file mode 100644 index 000000000..42fff7f2f --- /dev/null +++ b/cmake/modules/FindSRSGUI.cmake @@ -0,0 +1,42 @@ +# - Try to find SRSGUI +# Once done this will define +# SRSGUI_FOUND - System has srsgui +# SRSGUI_INCLUDE_DIRS - The srsgui include directories +# SRSGUI_LIBRARIES - The srsgui library + +find_package(PkgConfig) +pkg_check_modules(PC_SRSGUI QUIET srsgui) +IF(NOT SRSGUI_FOUND) + +FIND_PATH( + SRSGUI_INCLUDE_DIRS + NAMES srsgui/srsgui.h + HINTS ${PC_SRSGUI_INCLUDEDIR} + ${PC_SRSGUI_INCLUDE_DIRS} + $ENV{SRSGUI_DIR}/include + PATHS /usr/local/include + /usr/include +) + +FIND_LIBRARY( + SRSGUI_LIBRARIES + NAMES srsgui + HINTS ${PC_SRSGUI_LIBDIR} + ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib64 + $ENV{SRSGUI_DIR}/lib + PATHS /usr/local/lib + /usr/local/lib64 + /usr/lib + /usr/lib64 +) + +message(STATUS "SRSGUI LIBRARIES " ${SRSGUI_LIBRARIES}) +message(STATUS "SRSGUI INCLUDE DIRS " ${SRSGUI_INCLUDE_DIRS}) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SRSGUI DEFAULT_MSG SRSGUI_LIBRARIES SRSGUI_INCLUDE_DIRS) +MARK_AS_ADVANCED(SRSGUI_LIBRARIES SRSGUI_INCLUDE_DIRS) + +ENDIF(NOT SRSGUI_FOUND) + diff --git a/srslte/examples/CMakeLists.txt b/srslte/examples/CMakeLists.txt index 8ad6a2881..d381e4aad 100644 --- a/srslte/examples/CMakeLists.txt +++ b/srslte/examples/CMakeLists.txt @@ -62,13 +62,13 @@ ELSE(${CUHD_FIND} EQUAL -1) target_link_libraries(pdsch_enodeb cuhd) ENDIF(${CUHD_FIND} EQUAL -1) -FIND_PACKAGE(LIBSDRGUI) -IF(LIBSDRGUI_FOUND) - include_directories(${LIBSDRGUI_INCLUDE_DIRS}) - target_link_libraries(pdsch_ue ${LIBSDRGUI_LIBRARIES}) -ELSE(LIBSDRGUI_FOUND) +FIND_PACKAGE(SRSGUI) +IF(SRSGUI_FOUND) + include_directories(${SRSGUI_INCLUDE_DIRS}) + target_link_libraries(pdsch_ue ${SRSGUI_LIBRARIES}) +ELSE(SRSGUI_FOUND) SET_TARGET_PROPERTIES(pdsch_ue PROPERTIES COMPILE_DEFINITIONS "DISABLE_GRAPHICS") -ENDIF(LIBSDRGUI_FOUND) +ENDIF(SRSGUI_FOUND) ################################################################# diff --git a/srslte/examples/pdsch_ue.c b/srslte/examples/pdsch_ue.c index 0abc87860..83cc6e677 100644 --- a/srslte/examples/pdsch_ue.c +++ b/srslte/examples/pdsch_ue.c @@ -56,7 +56,7 @@ cell_search_cfg_t cell_detect_config = { //#define STDOUT_COMPACT #ifndef DISABLE_GRAPHICS -#include "libsdrgui/libsdrgui.h" +#include "srsgui/srsgui.h" void init_plots(); pthread_t plot_thread; sem_t plot_sem; diff --git a/srslte/examples/usrp_capture.c b/srslte/examples/usrp_capture.c index 927bd1244..085f66555 100644 --- a/srslte/examples/usrp_capture.c +++ b/srslte/examples/usrp_capture.c @@ -61,7 +61,7 @@ void usage(char *prog) { void parse_args(int argc, char **argv) { int opt; - while ((opt = getopt(argc, argv, "agnvfo")) != -1) { + while ((opt = getopt(argc, argv, "agrnvfo")) != -1) { switch (opt) { case 'o': output_file_name = argv[optind]; diff --git a/srslte/lib/CMakeLists.txt b/srslte/lib/CMakeLists.txt index b887feeb3..d671d98ca 100644 --- a/srslte/lib/CMakeLists.txt +++ b/srslte/lib/CMakeLists.txt @@ -38,7 +38,7 @@ ELSE(${DISABLE_VOLK}) FIND_PACKAGE(Volk) ENDIF(${DISABLE_VOLK}) -FIND_PACKAGE(LIBSDRGUI) +FIND_PACKAGE(SRSGUI) ######################################################################## # Recurse subdirectories and compile all source files into the same lib diff --git a/srslte/lib/sync/test/CMakeLists.txt b/srslte/lib/sync/test/CMakeLists.txt index 05e3e12f0..d11060a92 100644 --- a/srslte/lib/sync/test/CMakeLists.txt +++ b/srslte/lib/sync/test/CMakeLists.txt @@ -25,17 +25,27 @@ LIST(FIND OPTIONAL_LIBS cuhd CUHD_FIND) -FIND_PACKAGE(LIBSDRGUI) +FIND_PACKAGE(SRSGUI) + +ADD_EXECUTABLE(pss_file pss_file.c) +TARGET_LINK_LIBRARIES(pss_file srslte) + +IF(SRSGUI_FOUND) + include_directories(${SRSGUI_INCLUDE_DIRS}) + target_link_libraries(pss_file ${SRSGUI_LIBRARIES}) +ELSE(SRSGUI_FOUND) + SET_TARGET_PROPERTIES(pss_file PROPERTIES COMPILE_DEFINITIONS "DISABLE_GRAPHICS") +ENDIF(SRSGUI_FOUND) IF(${CUHD_FIND} GREATER -1) ADD_EXECUTABLE(pss_usrp pss_usrp.c) TARGET_LINK_LIBRARIES(pss_usrp srslte cuhd) - IF(LIBSDRGUI_FOUND) - include_directories(${LIBSDRGUI_INCLUDE_DIRS}) - target_link_libraries(pss_usrp ${LIBSDRGUI_LIBRARIES}) - ELSE(LIBSDRGUI_FOUND) + IF(SRSGUI_FOUND) + include_directories(${SRSGUI_INCLUDE_DIRS}) + target_link_libraries(pss_usrp ${SRSGUI_LIBRARIES}) + ELSE(SRSGUI_FOUND) SET_TARGET_PROPERTIES(pss_usrp PROPERTIES COMPILE_DEFINITIONS "DISABLE_GRAPHICS") - ENDIF(LIBSDRGUI_FOUND) + ENDIF(SRSGUI_FOUND) ENDIF(${CUHD_FIND} GREATER -1) diff --git a/srslte/lib/sync/test/pss_file.c b/srslte/lib/sync/test/pss_file.c new file mode 100644 index 000000000..a60a1c91c --- /dev/null +++ b/srslte/lib/sync/test/pss_file.c @@ -0,0 +1,400 @@ +/** + * + * \section COPYRIGHT + * + * Copyright 2013-2014 The srsLTE Developers. See the + * COPYRIGHT file at the top-level directory of this distribution. + * + * \section LICENSE + * + * This file is part of the srsLTE library. + * + * srsLTE is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * srsLTE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * A copy of the GNU Lesser General Public License can be found in + * the LICENSE file in the top-level directory of this distribution + * and at http://www.gnu.org/licenses/. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "srslte/srslte.h" + + +#ifndef DISABLE_GRAPHICS +void init_plots(); +void do_plots(float *corr, float energy, uint32_t size, cf_t ce[SRSLTE_PSS_LEN]); +void do_plots_sss(float *corr_m0, float *corr_m1); +void destroy_plots(); +#endif + + +bool disable_plots = false; +char *input_file_name; +int cell_id = -1; +int nof_frames = -1; +uint32_t fft_size=64; +float threshold = 0.4; +int N_id_2_sync = -1; +srslte_cp_t cp=SRSLTE_SRSLTE_CP_NORM; + +void usage(char *prog) { + printf("Usage: %s [nlestdv] -i cell_id -f input_file_name\n", prog); + printf("\t-n nof_frames [Default %d]\n", nof_frames); + printf("\t-l N_id_2 to sync [Default use cell_id]\n"); + printf("\t-e Extended CP [Default Normal]\n", fft_size); + printf("\t-s symbol_sz [Default %d]\n", fft_size); + printf("\t-t threshold [Default %.2f]\n", threshold); +#ifndef DISABLE_GRAPHICS + printf("\t-d disable plots [Default enabled]\n"); +#else + printf("\t plots are disabled. Graphics library not available\n"); +#endif + printf("\t-v srslte_verbose\n"); +} + +void parse_args(int argc, char **argv) { + int opt; + while ((opt = getopt(argc, argv, "nlestdvif")) != -1) { + switch (opt) { + case 'f': + input_file_name = argv[optind]; + break; + case 't': + threshold = atof(argv[optind]); + break; + case 'e': + cp = SRSLTE_SRSLTE_CP_EXT; + break; + case 'i': + cell_id = atoi(argv[optind]); + break; + case 'l': + N_id_2_sync = atoi(argv[optind]); + break; + case 's': + fft_size = atoi(argv[optind]); + break; + case 'n': + nof_frames = atoi(argv[optind]); + break; + case 'd': + disable_plots = true; + break; + case 'v': + srslte_verbose++; + break; + default: + usage(argv[0]); + exit(-1); + } + } + if (cell_id < 0) { + usage(argv[0]); + exit(-1); + } +} + float m0_value, m1_value; + +int main(int argc, char **argv) { + srslte_filesource_t fsrc; + cf_t *buffer; + int frame_cnt, n; + srslte_pss_synch_t pss; + srslte_cfo_t cfocorr, cfocorr64; + srslte_sss_synch_t sss; + int32_t flen; + int peak_idx, last_peak; + float peak_value; + float mean_peak; + uint32_t nof_det, nof_nodet, nof_nopeak, nof_nopeakdet; + cf_t ce[SRSLTE_PSS_LEN]; + + parse_args(argc, argv); + + if (N_id_2_sync == -1) { + N_id_2_sync = cell_id%3; + } + uint32_t N_id_2 = cell_id%3; + uint32_t N_id_1 = cell_id/3; + +#ifndef DISABLE_GRAPHICS + if (!disable_plots) + init_plots(); +#endif + + flen = 4800*(fft_size/64); + + buffer = malloc(sizeof(cf_t) * flen * 2); + if (!buffer) { + perror("malloc"); + exit(-1); + } + + if (srslte_pss_synch_init_fft(&pss, flen, fft_size)) { + fprintf(stderr, "Error initiating PSS\n"); + exit(-1); + } + + if (srslte_pss_synch_set_N_id_2(&pss, N_id_2_sync)) { + fprintf(stderr, "Error setting N_id_2=%d\n",N_id_2_sync); + exit(-1); + } + + srslte_cfo_init(&cfocorr, flen); + srslte_cfo_init(&cfocorr64, flen); + + if (srslte_sss_synch_init(&sss, fft_size)) { + fprintf(stderr, "Error initializing SSS object\n"); + return SRSLTE_ERROR; + } + + srslte_sss_synch_set_N_id_2(&sss, N_id_2); + + printf("Opening file...\n"); + if (srslte_filesource_init(&fsrc, input_file_name, SRSLTE_COMPLEX_FLOAT_BIN)) { + fprintf(stderr, "Error opening file %s\n", input_file_name); + exit(-1); + } + printf("N_id_2: %d\n", N_id_2); + + printf("Frame length %d samples\n", flen); + printf("PSS detection threshold: %.2f\n", threshold); + + nof_det = nof_nodet = nof_nopeak = nof_nopeakdet = 0; + frame_cnt = 0; + last_peak = 0; + mean_peak = 0; + int peak_offset = 0; + float cfo; + float mean_cfo = 0; + uint32_t m0, m1; + uint32_t sss_error1 = 0, sss_error2 = 0, sss_error3 = 0; + uint32_t cp_is_norm = 0; + + srslte_sync_t ssync; + bzero(&ssync, sizeof(srslte_sync_t)); + ssync.fft_size = fft_size; + + while(frame_cnt < nof_frames || nof_frames == -1) { + n = srslte_filesource_read(&fsrc, buffer, flen - peak_offset); + if (n < 0) { + fprintf(stderr, "Error reading samples\n"); + exit(-1); + } + if (n < flen - peak_offset) { + fprintf(stdout, "End of file\n"); + break; + } + + peak_idx = srslte_pss_synch_find_pss(&pss, buffer, &peak_value); + if (peak_idx < 0) { + fprintf(stderr, "Error finding PSS peak\n"); + exit(-1); + } + + mean_peak = SRSLTE_VEC_CMA(peak_value, mean_peak, frame_cnt); + + if (peak_value >= threshold) { + nof_det++; + + if (peak_idx >= fft_size) { + + // Estimate CFO + cfo = srslte_pss_synch_cfo_compute(&pss, &buffer[peak_idx-fft_size]); + mean_cfo = SRSLTE_VEC_CMA(cfo, mean_cfo, frame_cnt); + + // Correct CFO + srslte_cfo_correct(&cfocorr, buffer, buffer, -mean_cfo / fft_size); + + // Estimate channel + if (srslte_pss_synch_chest(&pss, &buffer[peak_idx-fft_size], ce)) { + fprintf(stderr, "Error computing channel estimation\n"); + exit(-1); + } + + // Find SSS + int sss_idx = peak_idx-2*fft_size-(SRSLTE_CP_ISNORM(cp)?SRSLTE_CP(fft_size, SRSLTE_SRSLTE_CP_NORM_LEN):SRSLTE_CP(fft_size, SRSLTE_SRSLTE_CP_EXT_LEN)); + if (sss_idx >= 0 && sss_idx < flen-fft_size) { + srslte_sss_synch_m0m1_partial(&sss, &buffer[sss_idx], 3, NULL, &m0, &m0_value, &m1, &m1_value); + if (srslte_sss_synch_N_id_1(&sss, m0, m1) != N_id_1) { + sss_error2++; + } + INFO("Partial N_id_1: %d\n", srslte_sss_synch_N_id_1(&sss, m0, m1)); + srslte_sss_synch_m0m1_diff(&sss, &buffer[sss_idx], &m0, &m0_value, &m1, &m1_value); + if (srslte_sss_synch_N_id_1(&sss, m0, m1) != N_id_1) { + sss_error3++; + } + INFO("Diff N_id_1: %d\n", srslte_sss_synch_N_id_1(&sss, m0, m1)); + srslte_sss_synch_m0m1_partial(&sss, &buffer[sss_idx], 1, NULL, &m0, &m0_value, &m1, &m1_value); + if (srslte_sss_synch_N_id_1(&sss, m0, m1) != N_id_1) { + sss_error1++; + } + INFO("Full N_id_1: %d\n", srslte_sss_synch_N_id_1(&sss, m0, m1)); + } + + // Estimate CP + if (peak_idx > 2*(fft_size + SRSLTE_CP_EXT(fft_size))) { + srslte_cp_t cp = srslte_sync_detect_cp(&ssync, buffer, peak_idx); + if (SRSLTE_CP_ISNORM(cp)) { + cp_is_norm++; + } + } + + } else { + INFO("No space for CFO computation. Frame starts at \n",peak_idx); + } + + if(srslte_sss_synch_subframe(m0,m1) == 0) + { +#ifndef DISABLE_GRAPHICS + if (!disable_plots) + do_plots_sss(sss.corr_output_m0, sss.corr_output_m1); +#endif + } + + } else { + nof_nodet++; + } + + if (frame_cnt > 100) { + if (abs(last_peak-peak_idx) > 4) { + if (peak_value >= threshold) { + nof_nopeakdet++; + } + nof_nopeak++; + } + } + + frame_cnt++; + + printf("[%5d]: Pos: %5d, PSR: %4.1f (~%4.1f) Pdet: %4.2f, " + "FA: %4.2f, CFO: %+4.1f KHz SSSmiss: %4.2f/%4.2f/%4.2f CPNorm: %.0f\%\r", + frame_cnt, + peak_idx, + peak_value, mean_peak, + (float) nof_det/frame_cnt, + (float) nof_nopeakdet/frame_cnt, mean_cfo*15, + (float) sss_error1/nof_det,(float) sss_error2/nof_det,(float) sss_error3/nof_det, + (float) cp_is_norm/nof_det * 100); + + if (SRSLTE_VERBOSE_ISINFO()) { + printf("\n"); + } + + usleep(10000); + +#ifndef DISABLE_GRAPHICS + if (!disable_plots) + do_plots(pss.conv_output_avg, pss.conv_output_avg[peak_idx], pss.fft_size+pss.frame_size-1, ce); +#endif + + last_peak = peak_idx; + + } + + srslte_pss_synch_free(&pss); + free(buffer); + srslte_filesource_free(&fsrc); +#ifndef DISABLE_GRAPHICS + if (!disable_plots) + destroy_plots(); +#endif + + printf("Ok\n"); + exit(0); +} + +extern cf_t *tmp2; + + +/********************************************************************** + * Plotting Functions + ***********************************************************************/ +#ifndef DISABLE_GRAPHICS + + +#include "srsgui/srsgui.h" +plot_real_t pssout; +//plot_complex_t pce; + +plot_real_t psss1;//, psss2; + +float tmp[100000]; +cf_t tmpce[SRSLTE_PSS_LEN]; + + +void init_plots() { + sdrgui_init(); + plot_real_init(&pssout); + plot_real_setTitle(&pssout, "PSS xCorr"); + plot_real_setLabels(&pssout, "Index", "Absolute value"); + plot_real_setYAxisScale(&pssout, 0, 1); + + /* + plot_complex_init(&pce); + plot_complex_setTitle(&pce, "Channel Estimates"); + plot_complex_setYAxisScale(&pce, Ip, -2, 2); + plot_complex_setYAxisScale(&pce, Q, -2, 2); + plot_complex_setYAxisScale(&pce, Magnitude, 0, 2); + plot_complex_setYAxisScale(&pce, Phase, -M_PI, M_PI); + */ + + plot_real_init(&psss1); + plot_real_setTitle(&psss1, "SSS xCorr m0"); + plot_real_setLabels(&psss1, "Index", "Absolute value"); + plot_real_setYAxisScale(&psss1, 0, 1); + + /* + plot_real_init(&psss2); + plot_real_setTitle(&psss2, "SSS xCorr m1"); + plot_real_setLabels(&psss2, "Index", "Absolute value"); + plot_real_setYAxisScale(&psss2, 0, 1); + */ + + +} + +void do_plots(float *corr, float energy, uint32_t size, cf_t ce[SRSLTE_PSS_LEN]) { + srslte_vec_sc_prod_fff(corr,1./energy,tmp, size); + plot_real_setNewData(&pssout, tmp, size); + +// float norm = srslte_vec_avg_power_cf(ce, SRSLTE_PSS_LEN); + // srslte_vec_sc_prod_cfc(ce, 1.0/sqrt(norm), tmpce, SRSLTE_PSS_LEN); + + //plot_complex_setNewData(&pce, tmpce, SRSLTE_PSS_LEN); +} + +void do_plots_sss(float *corr_m0, float *corr_m1) { + if (m0_value > 0) + srslte_vec_sc_prod_fff(corr_m0,1./m0_value,corr_m0, SRSLTE_SSS_N); + plot_real_setNewData(&psss1, corr_m0, SRSLTE_SSS_N); + +// if (m1_value > 0) +// srslte_vec_sc_prod_fff(corr_m1,1./m1_value,corr_m1, SRSLTE_SSS_N); +// plot_real_setNewData(&psss2, corr_m1, SRSLTE_SSS_N); +} + +void destroy_plots() { + sdrgui_exit(); +} + + +#endif diff --git a/srslte/lib/sync/test/pss_usrp.c b/srslte/lib/sync/test/pss_usrp.c index 4a1e9479f..b0671f187 100644 --- a/srslte/lib/sync/test/pss_usrp.c +++ b/srslte/lib/sync/test/pss_usrp.c @@ -335,7 +335,7 @@ extern cf_t *tmp2; #ifndef DISABLE_GRAPHICS -#include "libsdrgui/libsdrgui.h" +#include "srsgui/srsgui.h" plot_real_t pssout; //plot_complex_t pce;