forked from Archive/PX4-Autopilot
gyro_fft: manually inline subset of arm_rfft_init_q15 to save flash
This commit is contained in:
parent
1429423876
commit
c7c6122bfd
|
@ -43,49 +43,6 @@ GyroFFT::GyroFFT() :
|
||||||
ModuleParams(nullptr),
|
ModuleParams(nullptr),
|
||||||
ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::lp_default)
|
ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::lp_default)
|
||||||
{
|
{
|
||||||
switch (_param_imu_gyro_fft_len.get()) {
|
|
||||||
case 128:
|
|
||||||
AllocateBuffers<128>();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 256:
|
|
||||||
AllocateBuffers<256>();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 512:
|
|
||||||
AllocateBuffers<512>();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1024:
|
|
||||||
AllocateBuffers<1024>();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2048:
|
|
||||||
AllocateBuffers<2048>();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4096:
|
|
||||||
AllocateBuffers<4096>();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// otherwise default to 256
|
|
||||||
PX4_ERR("Invalid IMU_GYRO_FFT_LEN=%.3f, resetting", (double)_param_imu_gyro_fft_len.get());
|
|
||||||
AllocateBuffers<256>();
|
|
||||||
_param_imu_gyro_fft_len.set(256);
|
|
||||||
_param_imu_gyro_fft_len.commit();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
_imu_gyro_fft_len = _param_imu_gyro_fft_len.get();
|
|
||||||
|
|
||||||
arm_rfft_init_q15(&_rfft_q15, _imu_gyro_fft_len, 0, 1);
|
|
||||||
|
|
||||||
// init Hanning window
|
|
||||||
for (int n = 0; n < _imu_gyro_fft_len; n++) {
|
|
||||||
const float hanning_value = 0.5f * (1.f - cosf(2.f * M_PI_F * n / (_imu_gyro_fft_len - 1)));
|
|
||||||
arm_float_to_q15(&hanning_value, &_hanning_window[n], 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GyroFFT::~GyroFFT()
|
GyroFFT::~GyroFFT()
|
||||||
|
@ -96,22 +53,109 @@ GyroFFT::~GyroFFT()
|
||||||
perf_free(_gyro_generation_gap_perf);
|
perf_free(_gyro_generation_gap_perf);
|
||||||
perf_free(_gyro_fifo_generation_gap_perf);
|
perf_free(_gyro_fifo_generation_gap_perf);
|
||||||
|
|
||||||
delete _gyro_data_buffer_x;
|
delete[] _gyro_data_buffer_x;
|
||||||
delete _gyro_data_buffer_y;
|
delete[] _gyro_data_buffer_y;
|
||||||
delete _gyro_data_buffer_z;
|
delete[] _gyro_data_buffer_z;
|
||||||
delete _hanning_window;
|
delete[] _hanning_window;
|
||||||
delete _fft_input_buffer;
|
delete[] _fft_input_buffer;
|
||||||
delete _fft_outupt_buffer;
|
delete[] _fft_outupt_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GyroFFT::init()
|
bool GyroFFT::init()
|
||||||
{
|
{
|
||||||
if (!SensorSelectionUpdate(true)) {
|
bool buffers_allocated = false;
|
||||||
PX4_WARN("sensor_gyro callback registration failed!");
|
|
||||||
ScheduleDelayed(500_ms);
|
// arm_rfft_init_q15(&_rfft_q15, _imu_gyro_fft_len, 0, 1) manually inlined to save flash
|
||||||
|
_rfft_q15.pTwiddleAReal = (q15_t *) realCoefAQ15;
|
||||||
|
_rfft_q15.pTwiddleBReal = (q15_t *) realCoefBQ15;
|
||||||
|
_rfft_q15.ifftFlagR = 0;
|
||||||
|
_rfft_q15.bitReverseFlagR = 1;
|
||||||
|
|
||||||
|
switch (_param_imu_gyro_fft_len.get()) {
|
||||||
|
// case 128:
|
||||||
|
// buffers_allocated = AllocateBuffers<128>();
|
||||||
|
// _rfft_q15.fftLenReal = 128;
|
||||||
|
// _rfft_q15.twidCoefRModifier = 64U;
|
||||||
|
// _rfft_q15.pCfft = &arm_cfft_sR_q15_len64;
|
||||||
|
// break;
|
||||||
|
|
||||||
|
case 256:
|
||||||
|
buffers_allocated = AllocateBuffers<256>();
|
||||||
|
_rfft_q15.fftLenReal = 256;
|
||||||
|
_rfft_q15.twidCoefRModifier = 32U;
|
||||||
|
_rfft_q15.pCfft = &arm_cfft_sR_q15_len128;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// case 512:
|
||||||
|
// buffers_allocated = AllocateBuffers<512>();
|
||||||
|
// _rfft_q15.fftLenReal = 512;
|
||||||
|
// _rfft_q15.twidCoefRModifier = 16U;
|
||||||
|
// _rfft_q15.pCfft = &arm_cfft_sR_q15_len256;
|
||||||
|
// break;
|
||||||
|
|
||||||
|
case 1024:
|
||||||
|
buffers_allocated = AllocateBuffers<1024>();
|
||||||
|
_rfft_q15.fftLenReal = 1024;
|
||||||
|
_rfft_q15.twidCoefRModifier = 8U;
|
||||||
|
_rfft_q15.pCfft = &arm_cfft_sR_q15_len512;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// case 2048:
|
||||||
|
// buffers_allocated = AllocateBuffers<2048>();
|
||||||
|
// _rfft_q15.fftLenReal = 2048;
|
||||||
|
// _rfft_q15.twidCoefRModifier = 4U;
|
||||||
|
// _rfft_q15.pCfft = &arm_cfft_sR_q15_len1024;
|
||||||
|
// break;
|
||||||
|
|
||||||
|
case 4096:
|
||||||
|
buffers_allocated = AllocateBuffers<4096>();
|
||||||
|
_rfft_q15.fftLenReal = 4096;
|
||||||
|
_rfft_q15.twidCoefRModifier = 2U;
|
||||||
|
_rfft_q15.pCfft = &arm_cfft_sR_q15_len2048;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// case 8192:
|
||||||
|
// buffers_allocated = AllocateBuffers<8192>();
|
||||||
|
// _rfft_q15.fftLenReal = 8192;
|
||||||
|
// _rfft_q15.twidCoefRModifier = 1U;
|
||||||
|
// _rfft_q15.pCfft = &arm_cfft_sR_q15_len4096;
|
||||||
|
// break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// otherwise default to 256
|
||||||
|
PX4_ERR("Invalid IMU_GYRO_FFT_LEN=%.3f, resetting", (double)_param_imu_gyro_fft_len.get());
|
||||||
|
AllocateBuffers<256>();
|
||||||
|
_param_imu_gyro_fft_len.set(256);
|
||||||
|
_param_imu_gyro_fft_len.commit();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
if (buffers_allocated) {
|
||||||
|
_imu_gyro_fft_len = _param_imu_gyro_fft_len.get();
|
||||||
|
|
||||||
|
// init Hanning window
|
||||||
|
for (int n = 0; n < _imu_gyro_fft_len; n++) {
|
||||||
|
const float hanning_value = 0.5f * (1.f - cosf(2.f * M_PI_F * n / (_imu_gyro_fft_len - 1)));
|
||||||
|
arm_float_to_q15(&hanning_value, &_hanning_window[n], 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SensorSelectionUpdate(true)) {
|
||||||
|
PX4_WARN("sensor_gyro callback registration failed!");
|
||||||
|
ScheduleDelayed(500_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
PX4_ERR("failed to allocate buffers");
|
||||||
|
delete[] _gyro_data_buffer_x;
|
||||||
|
delete[] _gyro_data_buffer_y;
|
||||||
|
delete[] _gyro_data_buffer_z;
|
||||||
|
delete[] _hanning_window;
|
||||||
|
delete[] _fft_input_buffer;
|
||||||
|
delete[] _fft_outupt_buffer;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GyroFFT::SensorSelectionUpdate(bool force)
|
bool GyroFFT::SensorSelectionUpdate(bool force)
|
||||||
|
@ -403,6 +447,7 @@ void GyroFFT::Update(const hrt_abstime ×tamp_sample, int16_t *input[], uint
|
||||||
// mark remaining slots empty
|
// mark remaining slots empty
|
||||||
for (int i = num_peaks_found; i < MAX_NUM_PEAKS; i++) {
|
for (int i = num_peaks_found; i < MAX_NUM_PEAKS; i++) {
|
||||||
peak_frequencies[axis][i] = NAN;
|
peak_frequencies[axis][i] = NAN;
|
||||||
|
peak_magnitude[axis][i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,6 +500,7 @@ int GyroFFT::print_status()
|
||||||
perf_print_counter(_cycle_perf);
|
perf_print_counter(_cycle_perf);
|
||||||
perf_print_counter(_cycle_interval_perf);
|
perf_print_counter(_cycle_interval_perf);
|
||||||
perf_print_counter(_fft_perf);
|
perf_print_counter(_fft_perf);
|
||||||
|
perf_print_counter(_gyro_generation_gap_perf);
|
||||||
perf_print_counter(_gyro_fifo_generation_gap_perf);
|
perf_print_counter(_gyro_fifo_generation_gap_perf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,7 @@ private:
|
||||||
void VehicleIMUStatusUpdate(bool force = false);
|
void VehicleIMUStatusUpdate(bool force = false);
|
||||||
|
|
||||||
template<size_t N>
|
template<size_t N>
|
||||||
void AllocateBuffers()
|
bool AllocateBuffers()
|
||||||
{
|
{
|
||||||
_gyro_data_buffer_x = new q15_t[N];
|
_gyro_data_buffer_x = new q15_t[N];
|
||||||
_gyro_data_buffer_y = new q15_t[N];
|
_gyro_data_buffer_y = new q15_t[N];
|
||||||
|
@ -92,6 +92,11 @@ private:
|
||||||
_hanning_window = new q15_t[N];
|
_hanning_window = new q15_t[N];
|
||||||
_fft_input_buffer = new q15_t[N];
|
_fft_input_buffer = new q15_t[N];
|
||||||
_fft_outupt_buffer = new q15_t[N * 2];
|
_fft_outupt_buffer = new q15_t[N * 2];
|
||||||
|
|
||||||
|
return (_gyro_data_buffer_x && _gyro_data_buffer_y && _gyro_data_buffer_z
|
||||||
|
&& _hanning_window
|
||||||
|
&& _fft_input_buffer
|
||||||
|
&& _fft_outupt_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr int MAX_SENSOR_COUNT = 4;
|
static constexpr int MAX_SENSOR_COUNT = 4;
|
||||||
|
|
|
@ -65,11 +65,8 @@ PARAM_DEFINE_FLOAT(IMU_GYRO_FFT_MAX, 256.f);
|
||||||
/**
|
/**
|
||||||
* IMU gyro FFT length.
|
* IMU gyro FFT length.
|
||||||
*
|
*
|
||||||
* @value 128 128
|
|
||||||
* @value 256 256
|
* @value 256 256
|
||||||
* @value 512 512
|
|
||||||
* @value 1024 1024
|
* @value 1024 1024
|
||||||
* @value 2048 2048
|
|
||||||
* @value 4096 4096
|
* @value 4096 4096
|
||||||
* @unit Hz
|
* @unit Hz
|
||||||
* @reboot_required true
|
* @reboot_required true
|
||||||
|
|
Loading…
Reference in New Issue