提交 402d1229 编写于 作者: M manjaro

estimate freq

上级 92d9f1c7
......@@ -28,10 +28,10 @@ int runSend()
char error_string[4096];
//Sample rate in Hz
double sprate = 240000 ;
double tx_freq = 200.0e6;
double tx_freq = 610.0e6;
double tx_sprate = sprate;
double tx_gain = 70;
double tx_bw = sprate/MODRATE_N<200000?200000:sprate/MODRATE_N;
double tx_bw = sprate;
//发射信号。MIMO时,可以指定0,1
size_t tx_channel[] = {0};
......
......@@ -7,6 +7,7 @@
#include <thread>
#include <memory>
#include <atomic>
#include <math.h>
#include "../waveform.h"
static bool stop_signal_called = false;
#define UHD_DO(X) \
......@@ -26,6 +27,10 @@ void sigint_handler(int code){
std::shared_ptr<SPTYPE[][2]> readbuf[2];
std::atomic<int> curr_active = 0;
std::atomic<int> curr_deal = 0;
//Sample rate in Hz
double sprate = 240000 ;
std::atomic<bool> syn = false;
//消费者线程,for rx
void dealer();
int runRecieve()
......@@ -35,12 +40,11 @@ int runRecieve()
//要用libuhd操作RTLSDR,需要soapyuhd 来代理
char dev_args[] = "available=Yes,driver=rtlsdr,label=Generic RTL2832U :: 77771111153705700,manufacturer=Generic,product=RTL2832U,rtl=0,serial=77771111153705700,tuner=Rafael Micro R820T,type=soapy";
char error_string[4096];
//Sample rate in Hz
double sprate = 240000 ;
//接收频率
double rx_freq = 200e6;
double rx_freq = 610e6;
double rx_sprate = sprate;
double rx_gain = 10.0;
double rx_gain = 0.0;
bool rx_agc = false;
double rx_bw = 240000;
//接收信号。MIMO时,可以指定0,1
......@@ -137,11 +141,11 @@ int runRecieve()
// Issue stream command
fprintf(stderr, "Issuing stream command.\n");
UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd));
readbuf[0] = std::shared_ptr<SPTYPE[][2]> (new SPTYPE[READ_BUF_SIZE+rx_sps_buff*4][2]);
readbuf[1] = std::shared_ptr<SPTYPE[][2]> (new SPTYPE[READ_BUF_SIZE+rx_sps_buff*4][2]);
size_t total_red = 0;
UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd));
//Read, RX in Main Thread
while (!stop_signal_called) {
size_t num_rx_samps = 0;
......@@ -161,7 +165,7 @@ int runRecieve()
{
fprintf(stderr, "Switch Cache to %d\n", (int) curr_active);
size_t start_move = READ_BUF_SIZE - WAVSIZE;
size_t end_move = total_red;
size_t end_move = total_red-1;
size_t copyto = end_move - start_move + 1;
SPTYPE (* dest)[2] = readbuf[1-curr_active].get();
SPTYPE (* src)[2] = readbuf[curr_active].get();
......@@ -169,6 +173,19 @@ int runRecieve()
memcpy(dest, src , copyto * sizeof(SPTYPE) * 2 );
total_red = copyto;
curr_active = 1 - curr_active;
if (!syn)
{
rx_stream_cmd.stream_mode = UHD_STREAM_MODE_STOP_CONTINUOUS;
UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd));
while (curr_active != curr_deal)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
fprintf(stderr,"Waiting for syn.\n");
}
rx_stream_cmd.stream_mode = UHD_STREAM_MODE_START_CONTINUOUS;
UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd));
}
}
}
if (rx_streamer) uhd_rx_streamer_free(&rx_streamer);
......@@ -186,8 +203,36 @@ int runRecieve()
void runDeal()
{
const int DealEnd = READ_BUF_SIZE - WAVSIZE;
float (*cross)[2][2] = new float[DealEnd][2][2];
float (*judge)[2] = new float[DealEnd][2];
const int steps = 201;
float (*cross[steps])[2][2] ;
for (int i=0;i<steps;++i)
cross[i] = new float[DealEnd][2][2];
float (*judge[steps])[2] ;
for (int i=0;i<steps;++i)
judge[i] = new float[DealEnd][2];
float (*freq_mv[steps])[2];
for (int i=0;i<steps;++i)
freq_mv[i] = new float[DealEnd][2];
float (*sig[steps])[2] ;
for (int i=0;i<steps;++i)
sig[i] = new float[DealEnd][2];
const float pi = 3.1415927;
for (int df = 0;df<steps;++df)
{
float f = (df-steps/2)*50;
for (int pv = 0;pv<DealEnd;++pv)
{
float t = pv / sprate;
freq_mv[df][pv][0] = cos(2*pi*f*t);
freq_mv[df][pv][1] = sin(2*pi*f*t);
}
}
int startDF = 0, endDF = steps;
while (!stop_signal_called) {
if ((int)curr_active==(int)curr_deal)
{
......@@ -197,45 +242,91 @@ void runDeal()
int deal = 1-curr_active;
short (*pBufRx)[2] = readbuf[deal].get();
fprintf(stderr,"Dealing %d\n",deal);
//xorr
#pragma omp simd
for (size_t i=0;i<DealEnd;++i)
float maxAbs = 0;
int maxDF = 2;
#pragma omp parallel for
for (int df = startDF;df<endDF;++df)
{
cross[i][0][0] = 0;
cross[i][0][1] = 0;
cross[i][1][0] = 0;
cross[i][1][1] = 0;
for (size_t j=0;j<WAVSIZE;++j)
//xorr
#pragma omp simd
for (size_t i=0;i<DealEnd;++i)
{
sig[df][i][0] = (pBufRx[i][0] * freq_mv[df][i][0] - pBufRx[i][1] * freq_mv[df][i][1]);
sig[df][i][1] = (pBufRx[i][0] * freq_mv[df][i][1] + pBufRx[i][1] * freq_mv[df][i][0]);
}
#pragma omp simd
for (size_t i=0;i<DealEnd;++i)
{
cross[df][i][0][0] = 0;
cross[df][i][0][1] = 0;
cross[df][i][1][0] = 0;
cross[df][i][1][1] = 0;
for (size_t j=0;j<WAVSIZE;++j)
{
cross[df][i][0][0] += (sig[df][i+j][0] * wav_xorr[0][j][0] - sig[df][i+j][1] * wav_xorr[0][j][1]);
cross[df][i][0][1] += (sig[df][i+j][0] * wav_xorr[0][j][1] + sig[df][i+j][1] * wav_xorr[0][j][0]);
cross[df][i][1][0] += (sig[df][i+j][0] * wav_xorr[1][j][0] - sig[df][i+j][1] * wav_xorr[1][j][1]);
cross[df][i][1][1] += (sig[df][i+j][0] * wav_xorr[1][j][1] + sig[df][i+j][1] * wav_xorr[1][j][0]);
}
judge[df][i][0] = (cross[df][i][0][0]/32768 * cross[df][i][0][0]/32768 + cross[df][i][0][1]/32768 * cross[df][i][0][1]/32768 );
judge[df][i][1] = (cross[df][i][1][0]/32768 * cross[df][i][1][0]/32768 + cross[df][i][1][1]/32768 * cross[df][i][1][1]/32768 );
}
float maxv = 0;
#pragma omp simd
for (size_t i=0;i<DealEnd;++i)
{
cross[i][0][0] += (pBufRx[i+j][0] * wav_xorr[0][j][0] - pBufRx[i+j][1] * wav_xorr[0][j][1]);
cross[i][0][1] += (pBufRx[i+j][0] * wav_xorr[0][j][1] + pBufRx[i+j][1] * wav_xorr[0][j][0]);
cross[i][1][0] += (pBufRx[i+j][0] * wav_xorr[1][j][0] - pBufRx[i+j][1] * wav_xorr[1][j][1]);
cross[i][1][1] += (pBufRx[i+j][0] * wav_xorr[1][j][1] + pBufRx[i+j][1] * wav_xorr[1][j][0]);
if (maxv<judge[df][i][0])
maxv = judge[df][i][0];
if (maxv<judge[df][i][1])
maxv = judge[df][i][1];
}
judge[i][0] = (cross[i][0][0]/32768 * cross[i][0][0]/32768 + cross[i][0][1]/32768 * cross[i][0][1]/32768 );
judge[i][1] = (cross[i][1][0]/32768 * cross[i][1][0]/32768 + cross[i][1][1]/32768 * cross[i][1][1]/32768 );
#pragma omp critical
{
if (maxv > maxAbs)
{
maxAbs = maxv;
maxDF = df;
}
}
}
printf ("MaxDF=%d\n",maxDF);
for (size_t i=0;i<DealEnd;++i)
{
if (judge[i][1] - judge[i][0] > 20000 )
if (judge[maxDF][i][0] >= 1000 || judge[maxDF][i][1] >= 1000 )
{
printf("0=%f, 1=%f, 1\n",judge[i][0],judge[i][1]);
fflush(stdout);
i+=WAVSIZE;
}
else if (judge[i][0] - judge[i][1] > 20000)
{
printf("0=%f, 1=%f, 0\n",judge[i][0],judge[i][1]);
fflush(stdout);
i+=WAVSIZE;
if (judge[maxDF][i][0] * 8 < judge[maxDF][i][1])
{
printf("%lu:0=%f, 1=%f, 1\n",i,judge[maxDF][i][0],judge[maxDF][i][1]);
fflush(stdout);
i+=WAVSIZE;
startDF = (maxDF - 2)<0?0:(maxDF - 2);
endDF = (maxDF + 2)>steps?steps:((maxDF + 2));
syn = true;
}
else if (judge[maxDF][i][1] * 8 < judge[maxDF][i][0])
{
printf("%lu:0=%f, 1=%f, 0\n",i,judge[maxDF][i][0],judge[maxDF][i][1]);
fflush(stdout);
i+=WAVSIZE;
startDF = (maxDF - 2)<0?0:(maxDF - 2);
endDF = (maxDF + 2)>steps?steps:((maxDF + 2));
syn = true;
}
}
}
//判决
curr_deal = 1-deal;
}
delete [] cross;
delete [] judge;
for (int i=0;i<steps;++i)
{
delete [] cross[i];
delete [] judge[i];
delete [] freq_mv[i];
delete [] sig[i];
}
}
int main()
{
......
......@@ -3,7 +3,7 @@
#include "waveform.h"
//4倍符号速率
SPTYPE wav_spread[2][WAVSIZE][2];
SPTYPE wav[2][MODRATE_N][2];
static SPTYPE wav[2][MODRATE_N][2];
float wav_xorr[2][WAVSIZE][2];
void init_wavform(void)
{
......@@ -15,7 +15,7 @@ void init_wavform(void)
wav[1][i][1] = -C_AMP ;
}
//扩频
char reg [21] = {1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
char reg [21] = {0,1,1,0,0,1,0,1,1,0,0,1,0,1,1,0,0,1,0,1,1};
//seq[0]是 0的符号,1是1的符号。每个符号中的0,1又对应了wav的IQ路
char seq[2][SPREAD_RAT];
memset(seq,0,sizeof(seq));
......
......@@ -2,8 +2,8 @@
#define WAVEFORM_H
typedef short SPTYPE;
#define MODRATE_N 4
#define C_AMP 8192
#define SPREAD_RAT 100
#define C_AMP 30000
#define SPREAD_RAT 128
#define WAVSIZE SPREAD_RAT*MODRATE_N
extern SPTYPE wav_spread[2][WAVSIZE][2];
extern float wav_xorr[2][WAVSIZE][2];
......
......@@ -47,13 +47,13 @@ int return_code = EXIT_SUCCESS;
static const int modraten = 4;
//Sample rate in Hz
const double sprate = 200000 ;
const double sprate = 240000 ;
int main(int /*argc*/, char* /*argv*/[])
{
const char dev_args[] = "";
//接收频率
double rx_freq = 200e6;
double rx_freq = 610e6;
double rx_sprate = sprate;
double rx_gain = 55.0;
bool rx_agc = true;
......@@ -62,9 +62,9 @@ int main(int /*argc*/, char* /*argv*/[])
size_t rx_channel[] = {0};
const char rx_ana[] = "RX2";
double tx_freq = 200e6;
double tx_freq = 610e6;
double tx_sprate = sprate;
double tx_gain = 40;
double tx_gain = 70;
double tx_bw = sprate;
//发射信号。MIMO时,可以指定0,1
size_t tx_channel[] = {0};
......@@ -368,7 +368,7 @@ int do_io(
}
static const int amp = 1024;
static const int amp = 30000;
static const int spread_ratio = 128;
static const size_t wav_size = spread_ratio*modraten;
static short wav_spread[2][wav_size][2];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册