提交 37a155eb 编写于 作者: M manjaro-xfce

软件无线电-相关使用FFT

上级 f3225970
......@@ -5,5 +5,5 @@ CONFIG -= qt
SOURCES += \
uhd_the_ark.cpp
LIBS += -luhd -lpthread -lgomp
LIBS += -luhd -lpthread -lgomp -lfftw3
QMAKE_CXXFLAGS_RELEASE += -fopenmp -O3 -fopenmp -mavx2
......@@ -15,7 +15,7 @@
#include <atomic>
#include <iostream>
#include <uhd.h>
#include <fftw3.h>
static bool stop_signal_called = false;
static char error_string[1024];
static char err_msg[1024];
......@@ -47,13 +47,13 @@ int return_code = EXIT_SUCCESS;
static const int modraten = 4;
//Sample rate in Hz
const double sprate = 240000 ;
const double sprate = 250000 ;
int main(int /*argc*/, char* /*argv*/[])
{
const char dev_args[] = "";
//接收频率
double rx_freq = 610e6;
double rx_freq = 200e6;
double rx_sprate = sprate;
double rx_gain = 55.0;
bool rx_agc = true;
......@@ -62,12 +62,12 @@ int main(int /*argc*/, char* /*argv*/[])
size_t rx_channel[] = {0};
const char rx_ana[] = "RX2";
double tx_freq = 610e6;
double tx_freq = 200e6;
double tx_sprate = sprate;
double tx_gain = 70;
double tx_bw = sprate;
//发射信号。MIMO时,可以指定0,1
size_t tx_channel[] = {0};
size_t tx_channel[] = {1};
const char tx_ana[] = "TX/RX";
if (sizeof(rx_channel)>sizeof(rx_channel[0]) || sizeof(tx_channel)>sizeof(tx_channel[0]) )
......@@ -196,7 +196,7 @@ int main(int /*argc*/, char* /*argv*/[])
// Set gain
fprintf(stderr, "Setting TX Gain: %f db...\n", tx_gain);
UHD_DO(uhd_usrp_set_tx_gain(usrp, tx_gain, 0, ""));
UHD_DO(uhd_usrp_set_tx_gain(usrp, tx_gain, tx_channel[0], ""));
// See what gain actually is
UHD_DO(uhd_usrp_get_tx_gain(usrp, tx_channel[0], "", &tx_gain));
......@@ -368,7 +368,7 @@ int do_io(
}
static const int amp = 30000;
static const int amp = 8192;
static const int spread_ratio = 128;
static const size_t wav_size = spread_ratio*modraten;
static short wav_spread[2][wav_size][2];
......@@ -474,6 +474,18 @@ void dealer()
const unsigned int half_sz = wav_size/2;
short (*pBufRx)[2] = rx_buf_ptr.get();
double (* ampwin)[2] = new double[wav_size][2];
fftw_complex *in[2], *out[2];
fftw_plan p[2];
in[0] = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * wav_size);
out[0] = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * wav_size);
p[0] = fftw_plan_dft_1d(wav_size, in[0], out[0], FFTW_FORWARD, FFTW_ESTIMATE);
in[1] = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * wav_size);
out[1] = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * wav_size);
p[1] = fftw_plan_dft_1d(wav_size, in[1], out[1], FFTW_FORWARD, FFTW_ESTIMATE);
//fftw_execute(p); /* repeat as needed */
double globalMax = 0;
while (!stop_signal_called)
{
if (deal_count + wav_size >= rx_count || rx_count < wav_size )
......@@ -489,20 +501,44 @@ void dealer()
++deal_count;
continue;
}
double cross[2][2] = {{0,0},{0,0}};
unsigned long long start_x = deal_count - wav_size;
//xorr
#pragma omp simd
for (size_t i=0;i<wav_size;++i)
{
const int xb = (start_x + i) % rxbuf_points;
cross[0][0] += (pBufRx[xb][0] * wav_xorr[0][i][0] - pBufRx[xb][1] * wav_xorr[0][i][1]);
cross[0][1] += (pBufRx[xb][0] * wav_xorr[0][i][1] + pBufRx[xb][1] * wav_xorr[0][i][0]);
cross[1][0] += (pBufRx[xb][0] * wav_xorr[1][i][0] - pBufRx[xb][1] * wav_xorr[1][i][1]);
cross[1][1] += (pBufRx[xb][0] * wav_xorr[1][i][1] + pBufRx[xb][1] * wav_xorr[1][i][0]);
in[0][i][0] = (pBufRx[xb][0] * wav_xorr[0][i][0] - pBufRx[xb][1] * wav_xorr[0][i][1])/16384.0;
in[0][i][1] = (pBufRx[xb][0] * wav_xorr[0][i][1] + pBufRx[xb][1] * wav_xorr[0][i][0])/16384.0;
in[1][i][0] = (pBufRx[xb][0] * wav_xorr[1][i][0] - pBufRx[xb][1] * wav_xorr[1][i][1])/16384.0;
in[1][i][1] = (pBufRx[xb][0] * wav_xorr[1][i][1] + pBufRx[xb][1] * wav_xorr[1][i][0])/16384.0;
}
fftw_execute(p[0]);
fftw_execute(p[1]);
double max_abs0 = 0, max_abs1 = 0;
for (size_t i=0;i<wav_size;++i)
{
const double a0 = out[0][i][0]*out[0][i][0] + out[0][i][1]*out[0][i][1];
const double a1 = out[1][i][0]*out[1][i][0] + out[1][i][1]*out[1][i][1];
if (a0 > max_abs0)
max_abs0 = a0;
if (a1 > max_abs1)
max_abs1 = a1;
}
ampwin[deal_count % wav_size][0] = max_abs0;
ampwin[deal_count % wav_size][1] = max_abs1;
if (globalMax < max_abs0)
{
printf("%lf,%lf\n",max_abs0,max_abs1);
globalMax = max_abs0;
}
if (globalMax < max_abs1)
{
printf("%lf,%lf\n",max_abs0,max_abs1);
globalMax = max_abs1;
}
ampwin[deal_count % wav_size][0] = cross[0][0]/32768.0*cross[0][0]/32768.0+ cross[0][1]/32768.0*cross[0][1]/32768.0;
ampwin[deal_count % wav_size][1] = cross[1][0]/32768.0*cross[1][0]/32768.0+ cross[1][1]/32768.0*cross[1][1]/32768.0;
bool best0 = true, best1=true;
......@@ -515,23 +551,28 @@ void dealer()
if (ampwin[(deal_count +i - wav_size )% wav_size][1] >= ampwin[(deal_count +half_sz - wav_size )% wav_size][1])
best1 = false;
}
if (ampwin[(deal_count +i - wav_size )% wav_size][1]*8 >= ampwin[(deal_count +half_sz - wav_size )% wav_size][0])
best0 = false;
if (ampwin[(deal_count +i - wav_size )% wav_size][0]*8 >= ampwin[(deal_count +half_sz - wav_size )% wav_size][1])
best1 = false;
}
if (ampwin[(deal_count +half_sz - wav_size )% wav_size][1]*10 >= ampwin[(deal_count +half_sz - wav_size )% wav_size][0])
best0 = false;
if (ampwin[(deal_count +half_sz - wav_size )% wav_size][0]*10 >= ampwin[(deal_count +half_sz - wav_size )% wav_size][1])
best1 = false;
if (best0 )
{
//next_test = deal_count + wav_size - modraten * 4;
next_test = deal_count + wav_size/2 - modraten * 16;
putchar('0');
}
else if (best1 )
{
//next_test = deal_count + wav_size - modraten * 4;
next_test = deal_count + wav_size/2 - modraten * 16;
putchar('1');
}
++deal_count;
}
delete [] ampwin;
fftw_destroy_plan(p[0]);
fftw_free(in[0]); fftw_free(out[0]);
fftw_destroy_plan(p[1]);
fftw_free(in[1]); fftw_free(out[1]);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册