Merge remote-tracking branch 'origin/issue_927' into integration_2025_w33 (!3395)
RFsim variable size H_awgn_mimo Closes #927
This commit is contained in:
@@ -181,7 +181,7 @@ static buffer_t *allocCirBuf(rfsimulator_state_t *bridge, int sock)
|
|||||||
ptr->conn_sock = sock;
|
ptr->conn_sock = sock;
|
||||||
ptr->lastReceivedTS = 0;
|
ptr->lastReceivedTS = 0;
|
||||||
ptr->headerMode = true;
|
ptr->headerMode = true;
|
||||||
ptr->trashingPacket = false;
|
ptr->trashingPacket = true;
|
||||||
ptr->transferPtr = (char *)&ptr->th;
|
ptr->transferPtr = (char *)&ptr->th;
|
||||||
ptr->remainToTransfer = sizeof(samplesBlockHeader_t);
|
ptr->remainToTransfer = sizeof(samplesBlockHeader_t);
|
||||||
int sendbuff = SEND_BUFF_SIZE;
|
int sendbuff = SEND_BUFF_SIZE;
|
||||||
@@ -980,7 +980,7 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
|
|||||||
for (int sock = 0; sock < MAX_FD_RFSIMU; sock++) {
|
for (int sock = 0; sock < MAX_FD_RFSIMU; sock++) {
|
||||||
buffer_t *ptr = &t->buf[sock];
|
buffer_t *ptr = &t->buf[sock];
|
||||||
|
|
||||||
if (ptr->circularBuf) {
|
if (ptr->circularBuf && !ptr->trashingPacket) {
|
||||||
bool reGenerateChannel = false;
|
bool reGenerateChannel = false;
|
||||||
|
|
||||||
// fixme: when do we regenerate
|
// fixme: when do we regenerate
|
||||||
@@ -991,15 +991,15 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
|
|||||||
if (t->poll_telnetcmdq)
|
if (t->poll_telnetcmdq)
|
||||||
t->poll_telnetcmdq(t->telnetcmd_qid, t);
|
t->poll_telnetcmdq(t->telnetcmd_qid, t);
|
||||||
|
|
||||||
for (int a = 0; a < nbAnt; a++) { // loop over number of Rx antennas
|
for (int a_rx = 0; a_rx < nbAnt; a_rx++) { // loop over number of Rx antennas
|
||||||
if (ptr->channel_model != NULL) { // apply a channel model
|
if (ptr->channel_model != NULL) { // apply a channel model
|
||||||
if (num_chanmod_channels == 0) {
|
if (num_chanmod_channels == 0) {
|
||||||
memset(temp_array, 0, sizeof(temp_array));
|
memset(temp_array, 0, sizeof(temp_array));
|
||||||
}
|
}
|
||||||
num_chanmod_channels++;
|
num_chanmod_channels++;
|
||||||
rxAddInput(ptr->circularBuf,
|
rxAddInput(ptr->circularBuf,
|
||||||
temp_array[a],
|
temp_array[a_rx],
|
||||||
a,
|
a_rx,
|
||||||
ptr->channel_model,
|
ptr->channel_model,
|
||||||
nsamps,
|
nsamps,
|
||||||
t->nextRxTstamp,
|
t->nextRxTstamp,
|
||||||
@@ -1008,7 +1008,7 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
|
|||||||
} else { // no channel modeling
|
} else { // no channel modeling
|
||||||
int nbAnt_tx = ptr->th.nbAnt; // number of Tx antennas
|
int nbAnt_tx = ptr->th.nbAnt; // number of Tx antennas
|
||||||
int firstIndex = (CirSize + t->nextRxTstamp - t->chan_offset) % CirSize;
|
int firstIndex = (CirSize + t->nextRxTstamp - t->chan_offset) % CirSize;
|
||||||
sample_t *out = (sample_t *)samplesVoid[a];
|
sample_t *out = (sample_t *)samplesVoid[a_rx];
|
||||||
if (nbAnt_tx == 1 && t->nb_cnx == 1) { // optimized for 1 Tx and 1 UE
|
if (nbAnt_tx == 1 && t->nb_cnx == 1) { // optimized for 1 Tx and 1 UE
|
||||||
sample_t *firstSample = (sample_t *)&(ptr->circularBuf[firstIndex]);
|
sample_t *firstSample = (sample_t *)&(ptr->circularBuf[firstIndex]);
|
||||||
if (firstIndex + nsamps > CirSize) {
|
if (firstIndex + nsamps > CirSize) {
|
||||||
@@ -1020,16 +1020,16 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// SIMD (with simde) optimization might be added here later
|
// SIMD (with simde) optimization might be added here later
|
||||||
double H_awgn_mimo[4][4] = {{1.0, 0.2, 0.1, 0.05}, // rx 0
|
LOG_D(HW, "nbAnt_tx %d nbAnt %d\n", nbAnt_tx, nbAnt);
|
||||||
{0.2, 1.0, 0.2, 0.1}, // rx 1
|
double H_awgn_mimo_coeff[nbAnt_tx];
|
||||||
{0.1, 0.2, 1.0, 0.2}, // rx 2
|
for (int a_tx = 0; a_tx < nbAnt_tx; a_tx++) {
|
||||||
{0.05, 0.1, 0.2, 1.0}}; // rx 3
|
uint32_t ant_diff = abs(a_tx - a_rx);
|
||||||
|
H_awgn_mimo_coeff[a_tx] = ant_diff ? (0.2 / ant_diff) : 1.0;
|
||||||
LOG_D(HW, "nbAnt_tx %d\n", nbAnt_tx);
|
}
|
||||||
for (int i = 0; i < nsamps; i++) { // loop over nsamps
|
for (int i = 0; i < nsamps; i++) { // loop over nsamps
|
||||||
for (int a_tx = 0; a_tx < nbAnt_tx; a_tx++) { // sum up signals from nbAnt_tx antennas
|
for (int a_tx = 0; a_tx < nbAnt_tx; a_tx++) { // sum up signals from nbAnt_tx antennas
|
||||||
out[i].r += (short)(ptr->circularBuf[((firstIndex + i) * nbAnt_tx + a_tx) % CirSize].r * H_awgn_mimo[a][a_tx]);
|
out[i].r += (short)(ptr->circularBuf[((firstIndex + i) * nbAnt_tx + a_tx) % CirSize].r * H_awgn_mimo_coeff[a_tx]);
|
||||||
out[i].i += (short)(ptr->circularBuf[((firstIndex + i) * nbAnt_tx + a_tx) % CirSize].i * H_awgn_mimo[a][a_tx]);
|
out[i].i += (short)(ptr->circularBuf[((firstIndex + i) * nbAnt_tx + a_tx) % CirSize].i * H_awgn_mimo_coeff[a_tx]);
|
||||||
} // end for a_tx
|
} // end for a_tx
|
||||||
} // end for i (number of samps)
|
} // end for i (number of samps)
|
||||||
} // end of 1 tx antenna optimization
|
} // end of 1 tx antenna optimization
|
||||||
|
|||||||
Reference in New Issue
Block a user