Sound Open Firmware
Loading...
Searching...
No Matches
mfcc_comp.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2022-2026 Intel Corporation.
4 *
5 * Author: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
6 */
7
8#ifndef __SOF_AUDIO_MFCC_MFCC_COMP_H__
9#define __SOF_AUDIO_MFCC_MFCC_COMP_H__
10
12#include <sof/audio/data_blob.h>
13#include <sof/math/auditory.h>
14#include <sof/math/dct.h>
15#include <sof/math/fft.h>
17#include <sof/ipc/msg.h>
18#include <stddef.h>
19#include <stdint.h>
20
21/* __XCC__ is both for xt_xcc and xt_clang */
22#if defined(__XCC__)
23# include <xtensa/config/core-isa.h>
24# if XCHAL_HAVE_HIFI4 || XCHAL_HAVE_HIFI5
25# define MFCC_HIFI4
26# elif XCHAL_HAVE_HIFI3
27# define MFCC_HIFI3
28# else
29# define MFCC_GENERIC
30# endif
31#else
32# define MFCC_GENERIC
33#endif
34
35#define MFCC_MAGIC 0x6d666363 /* ASCII for "mfcc" */
36#define MFCC_FFT_BITS 32
37#define MFCC_MAX_SAMPLE_RATE 64000 /* Max sample rate in Hz, limited by int16_t Mel scale */
38
40#define MFCC_CTRL_INDEX_VAD 0
41
49 uint32_t magic;
50 uint32_t frame_number;
51 int32_t reserved;
52 int32_t energy;
53 int32_t noise_energy;
54 int32_t vad_flag;
55};
56
58 int16_t *addr;
59 int16_t *end_addr;
60 int16_t *r_ptr;
61 int16_t *w_ptr;
62 int s_avail;
63 int s_free;
65};
66
68 int16_t coef;
69 int16_t delay;
70 int enable;
71};
72
74typedef void (*mfcc_source_func)(struct sof_source *source, struct mfcc_buffer *buf,
75 struct mfcc_pre_emph *emph, int frames, int source_channel);
76
89
95
135
136/* MFCC component private data */
140 struct comp_data_blob_handler *model_handler;
142 struct ipc_msg *msg;
144 enum sof_ipc_frame source_format;
145 bool vad_prev;
147};
148
149static inline int mfcc_buffer_samples_without_wrap(struct mfcc_buffer *buffer, int16_t *ptr)
150{
151 return buffer->end_addr - ptr;
152}
153
154static inline int16_t *mfcc_buffer_wrap(struct mfcc_buffer *buffer, int16_t *ptr)
155{
156 if (ptr >= buffer->end_addr)
157 ptr -= buffer->s_length;
158
159 return ptr;
160}
161
162int mfcc_setup(struct processing_module *mod, int max_frames, int rate, int channels);
163
164void mfcc_free_buffers(struct processing_module *mod);
165
166void mfcc_fill_prev_samples(struct mfcc_buffer *buf, int16_t *prev_data,
167 int prev_data_length);
168
170
171void mfcc_apply_window(struct mfcc_state *state, int input_shift);
172
177int mfcc_stft_process(struct processing_module *mod, struct mfcc_comp_data *cd);
178
187int mfcc_process_output(struct processing_module *mod, struct mfcc_comp_data *cd,
188 struct sof_source **sources, struct sof_sink **sinks,
189 int num_ceps, int frames);
190
191#if CONFIG_FORMAT_S16LE
192void mfcc_source_copy_s16(struct sof_source *source, struct mfcc_buffer *buf,
193 struct mfcc_pre_emph *emph, int frames, int source_channel);
194#endif
195
196#if CONFIG_FORMAT_S24LE
197void mfcc_source_copy_s24(struct sof_source *source, struct mfcc_buffer *buf,
198 struct mfcc_pre_emph *emph, int frames, int source_channel);
199#endif
200
201#if CONFIG_FORMAT_S32LE
202void mfcc_source_copy_s32(struct sof_source *source, struct mfcc_buffer *buf,
203 struct mfcc_pre_emph *emph, int frames, int source_channel);
204#endif
205
206#if CONFIG_IPC_MAJOR_4
207int mfcc_ipc_notification_init(struct processing_module *mod);
208
209void mfcc_send_vad_notification(struct processing_module *mod, uint32_t val);
210
211int mfcc_get_config(struct processing_module *mod,
212 uint32_t config_id, uint32_t *data_offset_size,
213 uint8_t *fragment, size_t fragment_size);
214
215int mfcc_set_config(struct processing_module *mod, uint32_t config_id,
216 enum module_cfg_fragment_position pos, uint32_t data_offset_size,
217 const uint8_t *fragment, size_t fragment_size, uint8_t *response,
218 size_t response_size);
219
220#else
221static inline int mfcc_ipc_notification_init(struct processing_module *mod)
222{
223 return 0;
224}
225
226static inline void mfcc_send_vad_notification(struct processing_module *mod, uint32_t val)
227{
228}
229
230static inline int mfcc_get_config(struct processing_module *mod,
231 uint32_t config_id, uint32_t *data_offset_size,
232 uint8_t *fragment, size_t fragment_size)
233{
234 struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment;
235 struct mfcc_comp_data *cd = module_get_private_data(mod);
236
237 return comp_data_blob_get_cmd(cd->model_handler, cdata, fragment_size);
238}
239
240static inline int mfcc_set_config(struct processing_module *mod, uint32_t config_id,
241 enum module_cfg_fragment_position pos, uint32_t data_offset_size,
242 const uint8_t *fragment, size_t fragment_size, uint8_t *response,
243 size_t response_size)
244{
245 struct mfcc_comp_data *cd = module_get_private_data(mod);
246
247 return comp_data_blob_set(cd->model_handler, pos, data_offset_size,
248 fragment, fragment_size);
249}
250#endif
251
252#ifdef UNIT_TEST
253void sys_comp_module_mfcc_interface_init(void);
254#endif
255
256#endif /* __SOF_AUDIO_MFCC_MFCC_COMP_H__ */
int comp_data_blob_set(struct comp_data_blob_handler *blob_handler, enum module_cfg_fragment_position pos, uint32_t data_offset_size, const uint8_t *fragment, size_t fragment_size)
Handles IPC set command.
int comp_data_blob_get_cmd(struct comp_data_blob_handler *blob_handler, struct sof_ipc_ctrl_data *cdata, int size)
Handles IPC get command.
int mfcc_process_output(struct processing_module *mod, struct mfcc_comp_data *cd, struct sof_source **sources, struct sof_sink **sinks, int num_ceps, int frames)
Prepare and commit MFCC output data after STFT processing.
void(* mfcc_source_func)(struct sof_source *source, struct mfcc_buffer *buf, struct mfcc_pre_emph *emph, int frames, int source_channel)
Type definition for source/sink based input copy function.
Definition mfcc_comp.h:74
void mfcc_source_copy_s32(struct sof_source *source, struct mfcc_buffer *buf, struct mfcc_pre_emph *emph, int frames, int source_channel)
void mfcc_fill_fft_buffer(struct mfcc_state *state)
static int mfcc_set_config(struct processing_module *mod, uint32_t config_id, enum module_cfg_fragment_position pos, uint32_t data_offset_size, const uint8_t *fragment, size_t fragment_size, uint8_t *response, size_t response_size)
Definition mfcc_comp.h:240
int mfcc_stft_process(struct processing_module *mod, struct mfcc_comp_data *cd)
Run STFT and Mel/DCT processing.
static void mfcc_send_vad_notification(struct processing_module *mod, uint32_t val)
Definition mfcc_comp.h:226
static int mfcc_buffer_samples_without_wrap(struct mfcc_buffer *buffer, int16_t *ptr)
Definition mfcc_comp.h:149
void mfcc_free_buffers(struct processing_module *mod)
static int mfcc_ipc_notification_init(struct processing_module *mod)
Definition mfcc_comp.h:221
int mfcc_setup(struct processing_module *mod, int max_frames, int rate, int channels)
void mfcc_fill_prev_samples(struct mfcc_buffer *buf, int16_t *prev_data, int prev_data_length)
void mfcc_source_copy_s16(struct sof_source *source, struct mfcc_buffer *buf, struct mfcc_pre_emph *emph, int frames, int source_channel)
static int mfcc_get_config(struct processing_module *mod, uint32_t config_id, uint32_t *data_offset_size, uint8_t *fragment, size_t fragment_size)
Definition mfcc_comp.h:230
void mfcc_apply_window(struct mfcc_state *state, int input_shift)
static int16_t * mfcc_buffer_wrap(struct mfcc_buffer *buffer, int16_t *ptr)
Definition mfcc_comp.h:154
Voice Activity Detection based on Mel spectrum energy.
Definition dct.h:24
struct icomplex32 - Storage for a normal complex number.
Definition icomplex32.h:23
Definition msg.h:33
Definition matrix.h:19
Definition mfcc_comp.h:57
int s_free
samples count
Definition mfcc_comp.h:63
int s_length
length in samples for wrap
Definition mfcc_comp.h:64
int s_avail
samples count
Definition mfcc_comp.h:62
int16_t * end_addr
Definition mfcc_comp.h:59
int16_t * addr
Definition mfcc_comp.h:58
int16_t * r_ptr
Definition mfcc_comp.h:60
int16_t * w_ptr
Definition mfcc_comp.h:61
Definition mfcc_comp.h:90
int num_ceps
Definition mfcc_comp.h:93
int16_t cepstral_lifter
Definition mfcc_comp.h:92
struct mat_matrix_16b * matrix
Definition mfcc_comp.h:91
Definition mfcc_comp.h:137
int max_frames
Definition mfcc_comp.h:143
struct comp_data_blob_handler * model_handler
Definition mfcc_comp.h:140
struct sof_mfcc_config * config
Definition mfcc_comp.h:141
enum sof_ipc_frame source_format
Source audio format for output sizing.
Definition mfcc_comp.h:144
bool vad_prev
Previous VAD state for edge detection.
Definition mfcc_comp.h:145
struct mfcc_state state
Definition mfcc_comp.h:138
struct mfcc_vad_state vad
Definition mfcc_comp.h:139
struct ipc_msg * msg
IPC notification for VAD switch control.
Definition mfcc_comp.h:142
mfcc_source_func source_func
source copy function
Definition mfcc_comp.h:146
Data header prepended to every MFCC output frame.
Definition mfcc_comp.h:48
int32_t noise_energy
Weighted noise floor energy in Q9.23.
Definition mfcc_comp.h:53
int32_t energy
Weighted signal energy in Q9.23.
Definition mfcc_comp.h:52
uint32_t frame_number
Frame number, counting calculated frames starting from 0.
Definition mfcc_comp.h:50
int32_t reserved
Reserved for future use, set to 0.
Definition mfcc_comp.h:51
int32_t vad_flag
VAD decision: 1 = speech, 0 = silence.
Definition mfcc_comp.h:54
uint32_t magic
Magic word MFCC_MAGIC (0x6d666363).
Definition mfcc_comp.h:49
Definition mfcc_comp.h:77
struct fft_plan * fft_plan
Definition mfcc_comp.h:80
int fft_size
Definition mfcc_comp.h:82
struct icomplex32 * fft_buf
fft_padded_size
Definition mfcc_comp.h:78
int half_fft_size
Definition mfcc_comp.h:86
int fft_padded_size
Definition mfcc_comp.h:83
struct icomplex32 * fft_out
fft_padded_size
Definition mfcc_comp.h:79
size_t fft_buffer_size
bytes
Definition mfcc_comp.h:87
int fft_buf_size
Definition mfcc_comp.h:85
int fft_hop_size
Definition mfcc_comp.h:84
int fft_fill_start_idx
Set to 0 for pad left, etc.
Definition mfcc_comp.h:81
Definition mfcc_comp.h:67
int16_t delay
Definition mfcc_comp.h:69
int enable
Definition mfcc_comp.h:70
int16_t coef
Definition mfcc_comp.h:68
Definition mfcc_comp.h:96
struct mfcc_buffer buf
Circular buffer for input data.
Definition mfcc_comp.h:97
int vad_silence_count
Consecutive VAD=0 hops since last speech.
Definition mfcc_comp.h:130
struct mfcc_pre_emph emph
Pre-emphasis filter.
Definition mfcc_comp.h:98
int buffer_size
Definition mfcc_comp.h:114
int16_t * triangles
Definition mfcc_comp.h:112
struct dct_plan_16 dct
DCT related.
Definition mfcc_comp.h:100
struct mfcc_data_header header
Data header for current output frame.
Definition mfcc_comp.h:123
int32_t mmax
Maximum Mel value in Q9.23.
Definition mfcc_comp.h:107
bool waiting_fill
booleans
Definition mfcc_comp.h:120
int32_t * out_stage
Dedicated staging buffer for pending output, decoupled from STFT scratch.
Definition mfcc_comp.h:127
bool mel_only
When true, output Mel spectra instead of cepstral coefficients.
Definition mfcc_comp.h:119
int32_t * power_spectra
Pointer to scratch.
Definition mfcc_comp.h:105
int32_t * mel_log_32
Pointer to scratch for 32-bit Mel output Q9.23.
Definition mfcc_comp.h:106
struct mfcc_fft fft
FFT related.
Definition mfcc_comp.h:99
struct mat_matrix_16b * mel_spectra
Pointer to scratch.
Definition mfcc_comp.h:103
int sample_rate
Definition mfcc_comp.h:118
struct mat_matrix_16b * cepstral_coef
Pointer to scratch.
Definition mfcc_comp.h:104
size_t sample_buffers_size
bytes
Definition mfcc_comp.h:124
int16_t buf_avail
Definition mfcc_comp.h:108
int high_freq
Definition mfcc_comp.h:117
bool prev_samples_valid
Definition mfcc_comp.h:121
int16_t dtx_trailing_silence
Number of trailing silence hops to send, from config.
Definition mfcc_comp.h:131
int16_t dtx_silence_interval
Send silence frame every Nth hop, 0 = disable.
Definition mfcc_comp.h:132
int16_t * prev_data
prev_data_size
Definition mfcc_comp.h:110
int low_freq
Definition mfcc_comp.h:116
int dtx_silence_counter
Counter for periodic silence frame send.
Definition mfcc_comp.h:133
int source_channel
Definition mfcc_comp.h:113
bool header_pending
True when data header not yet written for current output.
Definition mfcc_comp.h:122
int out_remain
Remaining int32_t samples to write to sink from staging.
Definition mfcc_comp.h:126
int prev_data_size
Definition mfcc_comp.h:115
int32_t * out_data_ptr
Read pointer into staging data for multi-period output.
Definition mfcc_comp.h:125
uint32_t hop_count
FFT hop counter, increments every processed hop.
Definition mfcc_comp.h:129
struct psy_mel_filterbank melfb
Mel filter bank.
Definition mfcc_comp.h:101
int16_t * buffers
Definition mfcc_comp.h:109
int16_t * window
fft_size
Definition mfcc_comp.h:111
struct mfcc_cepstral_lifter lifter
Cepstral lifter coefficients.
Definition mfcc_comp.h:102
int out_stage_size
Capacity of out_stage in int32_t samples.
Definition mfcc_comp.h:128
VAD state structure.
Definition mfcc_vad.h:54
Definition auditory.h:36
Generic control data.
Definition control.h:120
Definition mfcc.h:51