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 @@
#include <stdint.h>
#include <math.h>
#define SAMPLE_COUNT 1536
#define SAMPLE_COUNT 100
int main(void) {
FILE *outfile;
......@@ -11,16 +11,17 @@ int main(void) {
float time;
for(i = 0; i < SAMPLE_COUNT; i++) {
fflush(stdout);
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;
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");
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);
return 0;
......
......@@ -6,13 +6,13 @@
#include "amarisoft/trx_driver.h"
#define SAMPLE_RATE_KHZ 23040
#define FLOAT_TO_CHAR_RATIO sizeof(float) / sizeof(char)
#define SAMPLE_RATE_KHZ 30720
#define COMPLEX_SIZE (sizeof(TRXComplex) / sizeof(char))
#define I1E6 1000000
#define I1E9 1000000000
struct TRXPlayContext {
float *samples;
TRXComplex *samples;
uint64_t sample_count;
uint64_t current_sample;
};
......@@ -28,30 +28,32 @@ int trx_play_read(TRXState *s, trx_timestamp_t *ptimestamp, void **psamples, int
struct TRXPlayContext *trx_play_ctx;
uint64_t extra_samples;
float **channels;
uint64_t copy_samples;
TRXComplex **channels;
trx_play_ctx = s->opaque;
channels = (float **) psamples;
channels = (TRXComplex **) psamples;
// Handle reading after end of buffer
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;
copy_samples = count - extra_samples;
memcpy(channels[0], 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, (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, copy_samples * sizeof(TRXComplex));
if(extra_samples > 0) {
memcpy(channels[0], trx_play_ctx->samples, extra_samples * sizeof(float));
memcpy(channels[1], trx_play_ctx->samples, extra_samples * sizeof(float));
memcpy(channels[0] + copy_samples, trx_play_ctx->samples, extra_samples * sizeof(TRXComplex));
memcpy(channels[1] + copy_samples, trx_play_ctx->samples, extra_samples * sizeof(TRXComplex));
}
trx_play_ctx->current_sample = extra_samples;
} else {
memcpy(channels[0], 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(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(TRXComplex));
//trx_play_ctx->current_sample += count;
trx_play_ctx->current_sample += count;
}
return count;
......@@ -93,22 +95,22 @@ int trx_driver_init(TRXState *s) {
// Allocate the right size
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);
samples_file_content = malloc(sample_count * sizeof(float));
result = fread(samples_file_content, sample_count, 1, samples_file_handle);
samples_file_content = malloc(sample_count * sizeof(TRXComplex));
result = fread(samples_file_content, sample_count * sizeof(TRXComplex), 1, samples_file_handle);
if(result != 1) {
fprintf(stderr, "trx_play: could not read samples from file\n");
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->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->trx_start_func2 = trx_play_start;
......
......@@ -156,11 +156,13 @@ int main(int argc, char *argv[]) {
int (*input_lib_init)(TRXState *s);
int (*output_lib_init)(TRXState *s);
float *input_samples = malloc(8192 * sizeof(float));
float *input_channels[2] = { input_samples, &input_samples[4096] };
// IQ samples are complex numbers
// 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));
float *output_channels[2] = { output_samples, &output_samples[4096] };
TRXComplex *output_samples = malloc(8192 * sizeof(TRXComplex));
TRXComplex *output_channels[2] = { output_samples, &output_samples[4096] };
while((opt = getopt(argc, argv, "c:p:")) != -1) {
if(opt == 'c') {
......@@ -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);
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);
......
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