0
1
mirror of https://github.com/radio95-rnt/fm95.git synced 2026-02-26 19:23:51 +01:00

add neon to chimer

This commit is contained in:
2025-03-27 21:28:49 +01:00
parent a3f3a39284
commit a345743853
2 changed files with 46 additions and 4 deletions

View File

@@ -34,7 +34,7 @@ Done!
## CPU Usage?
Should run completly fine on a pi 5, right now with the preemp and rds2, on a pi 3b, its 50-70% (without lpf its more like 25%-27%)
Should run completly fine on a pi 5, right now with the preemp and rds2, on a pi 3b, its 50-70% (without lpf its more like 25%-27%, lpf with neon optimization is about 50%)
## Other Apps

View File

@@ -11,6 +11,7 @@
#include "../lib/constants.h"
#include "../lib/oscillator.h"
#include "../lib/optimization.h"
#define DEFAULT_FREQ 1000.0f
#define DEFAULT_SAMPLE_RATE 4000
@@ -68,10 +69,50 @@ void show_help(char *name) {
);
}
void generate_signal(float *output, int buffer_size, Oscillator *osc, float volume,
int *elapsed_samples, int total_samples, int pip_samples,
int pause_samples, int beep_samples, int num_pips) {
void generate_signal(float *output, int buffer_size, Oscillator *osc, float volume, int *elapsed_samples, int total_samples, int pip_samples, int pause_samples, int beep_samples, int num_pips) {
#if USE_NEON
float32x4_t v_volume = vdupq_n_f32(volume);
for (int i = 0; i < buffer_size; i += 4) {
if (*elapsed_samples >= total_samples) {
vst1q_f32(&output[i], vdupq_n_f32(0.0f));
playing_sequence = 0;
} else {
int cycle_position = *elapsed_samples;
int pip_cycle = pip_samples + pause_samples;
float32x4_t v_samples;
if (cycle_position < num_pips * pip_cycle) {
int within_cycle = cycle_position % pip_cycle;
if (within_cycle < pip_samples) {
float samples[4] = {
get_oscillator_sin_sample(osc),
get_oscillator_sin_sample(osc),
get_oscillator_sin_sample(osc),
get_oscillator_sin_sample(osc),
};
v_samples = vmulq_f32(vld1q_f32(samples), v_volume);
} else {
v_samples = vdupq_n_f32(0.0f);
}
} else if (cycle_position < num_pips * pip_cycle + beep_samples) {
float samples[4] = {
get_oscillator_sin_sample(osc),
get_oscillator_sin_sample(osc),
get_oscillator_sin_sample(osc),
get_oscillator_sin_sample(osc),
};
v_samples = vmulq_f32(vld1q_f32(samples), v_volume);
} else {
v_samples = vdupq_n_f32(0.0f);
}
vst1q_f32(&output[i], v_samples);
(*elapsed_samples) += 4;
}
}
}
#else
for (int i = 0; i < buffer_size; i++) {
if (*elapsed_samples >= total_samples) {
output[i] = 0;
@@ -96,6 +137,7 @@ void generate_signal(float *output, int buffer_size, Oscillator *osc, float volu
(*elapsed_samples)++;
}
}
#endif
}
int check_time_for_sequence(int test_mode, int offset) {