Commit b26ab9e6 authored by Titouan Soulard's avatar Titouan Soulard

Fix a mistake: count is the number of IQ samples

parent 28952c5f
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#include <stdint.h> #include <stdint.h>
#include <math.h> #include <math.h>
#define SAMPLE_COUNT 1536 #define SAMPLE_COUNT 100
int main(void) { int main(void) {
FILE *outfile; FILE *outfile;
...@@ -11,16 +11,17 @@ int main(void) { ...@@ -11,16 +11,17 @@ int main(void) {
float time; float time;
for(i = 0; i < SAMPLE_COUNT; i++) { for(i = 0; i < SAMPLE_COUNT; i++) {
fflush(stdout);
time = (float) i / ((float) SAMPLE_COUNT); time = (float) i / ((float) SAMPLE_COUNT);
samples[i * 2] = cos(6.28318530718 * time); samples[i * 2] = cosf(6.28318530718 * time);
samples[i * 2 + 1] = 0.0; samples[i * 2 + 1] = 0.0;
printf("\rGenerating sample %lu: %f", i + 1, samples[i * 2]);
printf("\rGenerating sample for time %f: %f\n", time, samples[i * 2]);
fflush(stdout);
} }
printf("\nWriting...\n"); printf("\nWriting...\n");
outfile = fopen("pure_sine.bin", "w"); outfile = fopen("pure_sine.bin", "w");
fwrite(samples, SAMPLE_COUNT * sizeof(float), 1, outfile); fwrite(samples, SAMPLE_COUNT * 2 * sizeof(float), 1, outfile);
fclose(outfile); fclose(outfile);
return 0; return 0;
......
...@@ -6,13 +6,13 @@ ...@@ -6,13 +6,13 @@
#include "amarisoft/trx_driver.h" #include "amarisoft/trx_driver.h"
#define SAMPLE_RATE_KHZ 23040 #define SAMPLE_RATE_KHZ 30720
#define FLOAT_TO_CHAR_RATIO sizeof(float) / sizeof(char) #define COMPLEX_SIZE (sizeof(TRXComplex) / sizeof(char))
#define I1E6 1000000 #define I1E6 1000000
#define I1E9 1000000000 #define I1E9 1000000000
struct TRXPlayContext { struct TRXPlayContext {
float *samples; TRXComplex *samples;
uint64_t sample_count; uint64_t sample_count;
uint64_t current_sample; uint64_t current_sample;
}; };
...@@ -28,30 +28,32 @@ int trx_play_read(TRXState *s, trx_timestamp_t *ptimestamp, void **psamples, int ...@@ -28,30 +28,32 @@ int trx_play_read(TRXState *s, trx_timestamp_t *ptimestamp, void **psamples, int
struct TRXPlayContext *trx_play_ctx; struct TRXPlayContext *trx_play_ctx;
uint64_t extra_samples; uint64_t extra_samples;
float **channels; uint64_t copy_samples;
TRXComplex **channels;
trx_play_ctx = s->opaque; trx_play_ctx = s->opaque;
channels = (float **) psamples; channels = (TRXComplex **) psamples;
// Handle reading after end of buffer // Handle reading after end of buffer
if(trx_play_ctx->current_sample + count >= trx_play_ctx->sample_count) { if(trx_play_ctx->current_sample + count >= trx_play_ctx->sample_count) {
extra_samples = trx_play_ctx->current_sample + count - trx_play_ctx->sample_count; extra_samples = trx_play_ctx->current_sample + count - trx_play_ctx->sample_count;
copy_samples = count - extra_samples;
memcpy(channels[0], trx_play_ctx->samples + trx_play_ctx->current_sample, (count - extra_samples) * sizeof(float)); memcpy(channels[0], trx_play_ctx->samples + trx_play_ctx->current_sample, copy_samples * sizeof(TRXComplex));
memcpy(channels[1], trx_play_ctx->samples + trx_play_ctx->current_sample, (count - extra_samples) * sizeof(float)); memcpy(channels[1], trx_play_ctx->samples + trx_play_ctx->current_sample, copy_samples * sizeof(TRXComplex));
if(extra_samples > 0) { if(extra_samples > 0) {
memcpy(channels[0], trx_play_ctx->samples, extra_samples * sizeof(float)); memcpy(channels[0] + copy_samples, trx_play_ctx->samples, extra_samples * sizeof(TRXComplex));
memcpy(channels[1], trx_play_ctx->samples, extra_samples * sizeof(float)); memcpy(channels[1] + copy_samples, trx_play_ctx->samples, extra_samples * sizeof(TRXComplex));
} }
trx_play_ctx->current_sample = extra_samples; trx_play_ctx->current_sample = extra_samples;
} else { } else {
memcpy(channels[0], trx_play_ctx->samples + trx_play_ctx->current_sample, count * sizeof(float)); memcpy(channels[0], trx_play_ctx->samples + trx_play_ctx->current_sample, count * sizeof(TRXComplex));
memcpy(channels[1], trx_play_ctx->samples + trx_play_ctx->current_sample, count * sizeof(float)); memcpy(channels[1], trx_play_ctx->samples + trx_play_ctx->current_sample, count * sizeof(TRXComplex));
//trx_play_ctx->current_sample += count; trx_play_ctx->current_sample += count;
} }
return count; return count;
...@@ -93,22 +95,22 @@ int trx_driver_init(TRXState *s) { ...@@ -93,22 +95,22 @@ int trx_driver_init(TRXState *s) {
// Allocate the right size // Allocate the right size
fseek(samples_file_handle, 0, SEEK_END); fseek(samples_file_handle, 0, SEEK_END);
sample_count = ftell(samples_file_handle) / FLOAT_TO_CHAR_RATIO; sample_count = ftell(samples_file_handle) / COMPLEX_SIZE;
rewind(samples_file_handle); rewind(samples_file_handle);
samples_file_content = malloc(sample_count * sizeof(float)); samples_file_content = malloc(sample_count * sizeof(TRXComplex));
result = fread(samples_file_content, sample_count, 1, samples_file_handle); result = fread(samples_file_content, sample_count * sizeof(TRXComplex), 1, samples_file_handle);
if(result != 1) { if(result != 1) {
fprintf(stderr, "trx_play: could not read samples from file\n"); fprintf(stderr, "trx_play: could not read samples from file\n");
return -1; return -1;
} }
trx_play_ctx->samples = (float *) samples_file_content; trx_play_ctx->samples = (TRXComplex *) samples_file_content;
trx_play_ctx->sample_count = sample_count; trx_play_ctx->sample_count = sample_count;
trx_play_ctx->current_sample = 0; trx_play_ctx->current_sample = 0;
printf("trx_play: looping %u frames\n", sample_count); printf("trx_play: looping %u frames from %s\n", sample_count, samples_file_path);
s->opaque = trx_play_ctx; s->opaque = trx_play_ctx;
s->trx_start_func2 = trx_play_start; s->trx_start_func2 = trx_play_start;
......
...@@ -156,11 +156,13 @@ int main(int argc, char *argv[]) { ...@@ -156,11 +156,13 @@ int main(int argc, char *argv[]) {
int (*input_lib_init)(TRXState *s); int (*input_lib_init)(TRXState *s);
int (*output_lib_init)(TRXState *s); int (*output_lib_init)(TRXState *s);
float *input_samples = malloc(8192 * sizeof(float)); // IQ samples are complex numbers
float *input_channels[2] = { input_samples, &input_samples[4096] }; // A flat plane of Complex is created for all channels
TRXComplex *input_samples = malloc(8192 * sizeof(TRXComplex));
TRXComplex *input_channels[2] = { input_samples, &input_samples[4096] };
float *output_samples = malloc(8192 * sizeof(float)); TRXComplex *output_samples = malloc(8192 * sizeof(TRXComplex));
float *output_channels[2] = { output_samples, &output_samples[4096] }; TRXComplex *output_channels[2] = { output_samples, &output_samples[4096] };
while((opt = getopt(argc, argv, "c:p:")) != -1) { while((opt = getopt(argc, argv, "c:p:")) != -1) {
if(opt == 'c') { if(opt == 'c') {
...@@ -306,7 +308,7 @@ int main(int argc, char *argv[]) { ...@@ -306,7 +308,7 @@ int main(int argc, char *argv[]) {
count = input_trx_state.trx_read_func2(&input_trx_state, &input_ts, (void **) input_channels, count, 0, &read_md); count = input_trx_state.trx_read_func2(&input_trx_state, &input_ts, (void **) input_channels, count, 0, &read_md);
input_ts += count; input_ts += count;
output_trx_state.trx_write_func2(&output_trx_state, input_ts, (const void **) input_channels, count / 2, 0, &write_md); output_trx_state.trx_write_func2(&output_trx_state, input_ts, (const void **) input_channels, count, 0, &write_md);
} }
dlclose(input_lib_handle); dlclose(input_lib_handle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment