10 TX_buffer_generator::TX_buffer_generator(param* init_parameters){
18 parameters = init_parameters;
19 buffer_len = parameters->buffer_len;
22 w_type last_w_type = parameters->wave_type[0];
23 mixed_buffer_type =
false;
24 int chirp_counter = 0;
25 for(
size_t i = 0; i < parameters->wave_type.size(); i++){
26 if(parameters->wave_type[i]!=last_w_type)mixed_buffer_type =
true;
27 if(parameters->wave_type[i]==CHIRP)chirp_counter++;
30 print_error(
"Multiple chirp TX buffer generation has been requested. This feature is not implemented yet.");
33 if(mixed_buffer_type){
34 print_error(
"Mixed TX buffer generation has been requested. This feature is not implemented yet.");
57 get_ptr = &TX_buffer_generator::get_from_noise;
58 clr_ptr = &TX_buffer_generator::close_noise;
63 get_ptr = &TX_buffer_generator::get_from_tones;
64 clr_ptr = &TX_buffer_generator::close_host;
67 TONES_buffer_len = parameters->rate;
68 TONES_last_sample = 0;
77 base_buffer =
tone_gen(&info,parameters->rate);
80 if(buffer_len > parameters->rate){
83 int buffer_ratio = std::ceil((
float)buffer_len/(
float)parameters->rate);
84 TONES_buffer_len = buffer_ratio*parameters->rate;
87 base_buffer = (float2*)realloc(base_buffer, (TONES_buffer_len)*
sizeof(float2));
88 for(
int j = 1; j < buffer_ratio; j++){
89 memcpy(base_buffer + j*parameters->rate, base_buffer, parameters->rate *
sizeof(float2));
94 base_buffer = (float2*)realloc(base_buffer, (TONES_buffer_len + buffer_len)*
sizeof(float2));
97 memcpy(base_buffer + TONES_buffer_len, base_buffer, buffer_len *
sizeof(float2));
104 get_ptr = &TX_buffer_generator::get_from_chirp;
105 clr_ptr = &TX_buffer_generator::close_device_chirp;
109 cudaDeviceGetStreamPriorityRange ( &low_p, &high_p );
110 cudaStreamCreateWithPriority(&internal_stream,cudaStreamNonBlocking, high_p);
114 h_parameter.num_steps = parameters->swipe_s[0];
115 if(h_parameter.num_steps<1){
116 print_warning(
"Number of frequency steps of the chirp signal is not set. Setting it to maximum (chirp time * sampling rate).");
117 h_parameter.num_steps = parameters->chirp_t[0] * parameters->rate;
119 if(h_parameter.num_steps<2){
120 print_warning(
"Number of frequency steps of the chirp signal is less than 2. This may result in single tone generation.");
124 h_parameter.length = parameters->chirp_t[0] * parameters->rate / h_parameter.num_steps;
125 if(h_parameter.length<1){
126 print_warning(
"Duration of each frequency in chirp signal cannot be less than one sample. Setting duration of each tone to 1.");
127 h_parameter.length = 1;
128 h_parameter.num_steps = parameters->chirp_t[0] * parameters->rate;
132 h_parameter.chirpness = ((std::pow(2,32)-1)*(parameters->chirp_f[0]-parameters->freq[0])/((double)h_parameter.num_steps-1.))/(
double)parameters->rate;
136 h_parameter.f0 = (std::pow(2,32)-1) * ((
double)parameters->freq[0]/(double)parameters->rate);
142 h_parameter.freq_norm = 0;
146 scale = parameters->ampl[0];
151 cudaMemcpy(d_parameter, &h_parameter,
sizeof(
chirp_parameter),cudaMemcpyHostToDevice);
154 cudaMalloc((
void **)&base_buffer,
sizeof(float2)*buffer_len);
163 void TX_buffer_generator::get(float2** __restrict__ in){
168 (this->*get_ptr)(in);
172 void TX_buffer_generator::close(){
181 int TX_buffer_generator::prefill_queue(tx_queue* queue,
preallocator<float2>* memory, param* parameter_tx){
193 bool dynamic = parameter_tx->dynamic_buffer();
196 if(dynamic)tmp = memory->
get();
198 filling = queue->push(tmp);
199 std::this_thread::sleep_for(std::chrono::microseconds(200));
208 void TX_buffer_generator::get_from_chirp(float2** __restrict__ target){
211 chirp_gen_wrapper(base_buffer,buffer_len,d_parameter,last_index,internal_stream,scale);
214 last_index = (last_index + parameters->buffer_len) % (h_parameter.num_steps * h_parameter.length);
217 cudaMemcpyAsync(*target,base_buffer,
sizeof(float2)*buffer_len,cudaMemcpyDeviceToHost,internal_stream);
220 cudaStreamSynchronize(internal_stream);
223 void TX_buffer_generator::get_from_noise(float2** __restrict__ target){}
226 void TX_buffer_generator::get_from_tones(float2** __restrict__ target){
227 *target = base_buffer + TONES_last_sample;
228 TONES_last_sample = (TONES_last_sample + buffer_len) % TONES_buffer_len;
231 void TX_buffer_generator::get_from_noise(){}
234 void TX_buffer_generator::close_host(){
238 void TX_buffer_generator::close_device_chirp(){
239 cudaFree(base_buffer);
240 cudaFree(d_parameter);
241 cudaStreamDestroy(internal_stream);
244 void TX_buffer_generator::close_noise(){}
Descriptor of the mutitone generation.
void print_error(std::string text)
float2 * tone_gen(tone_parameters *info, int sampling_rate, float scale, bool device)
void chirp_gen_wrapper(float2 *__restrict__ output, unsigned int output_size, chirp_parameter *__restrict__ info, unsigned long int last_index, cudaStream_t internal_stream, float scale=1)
void print_warning(std::string text)