From e6d3486b65152ccb190e48cdcf61c145acfcd39e Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Thu, 21 May 2026 15:52:27 +0300 Subject: [PATCH 1/2] Audio: Selector: Add blob for stereo to double mono This patch adds build of blob downmix_stereo_to_mono.conf. It is useful for processing mono input for MFCC. The sum of left and right multiplied by 0.5 is passed to both left and right sink channels. The comment in blobs export is also updated to current path of the script. Signed-off-by: Seppo Ingalsuo --- src/audio/selector/tune/sof_selector_blobs.m | 13 +++++++++- .../micsel/downmix_stereo_to_doublemono.conf | 26 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tools/topology/topology2/include/components/micsel/downmix_stereo_to_doublemono.conf diff --git a/src/audio/selector/tune/sof_selector_blobs.m b/src/audio/selector/tune/sof_selector_blobs.m index 1b370d4030de..b2f70069ee0b 100644 --- a/src/audio/selector/tune/sof_selector_blobs.m +++ b/src/audio/selector/tune/sof_selector_blobs.m @@ -23,6 +23,7 @@ function sof_selector_blobs() IPC4_CHANNEL_CONFIG_STEREO = 1; IPC4_CHANNEL_CONFIG_QUATRO = 5; IPC4_CHANNEL_CONFIG_5_POINT_1 = 8; + IPC4_CHANNEL_CONFIG_DUAL_MONO = 9; IPC4_CHANNEL_CONFIG_7_POINT_1 = 12; % Matrix for 1:1 pass-through @@ -39,6 +40,16 @@ function sof_selector_blobs() sel.coeffs(1, 2) = 0.7071; stereo_to_mono_pack8 = write_blob(sel, "downmix_stereo_to_mono"); + % Stereo to dual-mono downmix + sel.ch_count = [2 2]; + sel.ch_config = [IPC4_CHANNEL_CONFIG_STEREO IPC4_CHANNEL_CONFIG_DUAL_MONO]; + sel.coeffs = zeros(8,8); + sel.coeffs(1, 1) = 0.5; + sel.coeffs(1, 2) = 0.5; + sel.coeffs(2, 1) = 0.5; + sel.coeffs(2, 2) = 0.5; + stereo_to_doublemono_pack8 = write_blob(sel, "downmix_stereo_to_doublemono"); + % 5.1 to stereo downmix sel.ch_count = [6 2]; sel.ch_config = [IPC4_CHANNEL_CONFIG_5_POINT_1 IPC4_CHANNEL_CONFIG_STEREO]; @@ -189,7 +200,7 @@ function write_8bit_packed(pack8, blobname) blob8 = sof_selector_build_blob(pack8); str_config = "selector_config"; str_exported = "Exported with script sof_selector_blobs.m"; - str_howto = "cd tools/tune/selector; octave sof_selector_blobs.m"; + str_howto = "cd src/audio/selector/tune; octave sof_selector_blobs.m"; sof_tools = '../../../../tools'; sof_tplg = fullfile(sof_tools, 'topology'); sof_tplg_selector = fullfile(sof_tplg, 'topology2/include/components/micsel'); diff --git a/tools/topology/topology2/include/components/micsel/downmix_stereo_to_doublemono.conf b/tools/topology/topology2/include/components/micsel/downmix_stereo_to_doublemono.conf new file mode 100644 index 000000000000..102097d1d1ee --- /dev/null +++ b/tools/topology/topology2/include/components/micsel/downmix_stereo_to_doublemono.conf @@ -0,0 +1,26 @@ +# Exported with script sof_selector_blobs.m 21-May-2026 +# cd src/audio/selector/tune; octave sof_selector_blobs.m +Object.Base.data."selector_config" { + bytes " + 0x53,0x4f,0x46,0x34,0x00,0x00,0x00,0x00, + 0x84,0x00,0x00,0x00,0x01,0xd0,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00" +} From 56bb5caeb41aa8b06101c2b45082012506203fdf Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Thu, 21 May 2026 16:21:36 +0300 Subject: [PATCH 2/2] Tools: Topology: Add Micsel module to MFCC capture pipeline This patch adds the Micsel (or Selector) module with a configuration blob for stereo to double mono to source of MFCC. The Micsel module has better input select capabilities than bare MFCC module. The sum of L+R provides a slightly better SNR than the single (left) channel pick with MFCC for it's mono processing. It will reduce a bit noise in the audio features and possibly improve speech recognition quality. The previous pipeline class host-gateway-src-mfcc-capture.conf is removed because there is no other use for it. Signed-off-by: Seppo Ingalsuo --- tools/topology/topology2/cavs-sdw.conf | 2 +- ...host-gateway-src-micsel-mfcc-capture.conf} | 40 +++++++++++++++---- .../intel/sdw-dmic-audio-feature.conf | 11 ++++- .../intel/sdw-jack-audio-feature.conf | 11 ++++- 4 files changed, 54 insertions(+), 10 deletions(-) rename tools/topology/topology2/include/pipelines/cavs/{host-gateway-src-mfcc-capture.conf => host-gateway-src-micsel-mfcc-capture.conf} (69%) diff --git a/tools/topology/topology2/cavs-sdw.conf b/tools/topology/topology2/cavs-sdw.conf index 6932543c06e5..10768b3f9683 100644 --- a/tools/topology/topology2/cavs-sdw.conf +++ b/tools/topology/topology2/cavs-sdw.conf @@ -27,7 +27,7 @@ - + diff --git a/tools/topology/topology2/include/pipelines/cavs/host-gateway-src-mfcc-capture.conf b/tools/topology/topology2/include/pipelines/cavs/host-gateway-src-micsel-mfcc-capture.conf similarity index 69% rename from tools/topology/topology2/include/pipelines/cavs/host-gateway-src-mfcc-capture.conf rename to tools/topology/topology2/include/pipelines/cavs/host-gateway-src-micsel-mfcc-capture.conf index 793f71b883ab..21b8170d393b 100644 --- a/tools/topology/topology2/include/pipelines/cavs/host-gateway-src-mfcc-capture.conf +++ b/tools/topology/topology2/include/pipelines/cavs/host-gateway-src-micsel-mfcc-capture.conf @@ -1,13 +1,13 @@ # -# SRC-MFCC capture pipeline +# SRC-Micsel-MFCC capture pipeline # # This class provides host pipeline for capture with MFCC audio features input. # All attributes defined herein are namespaced by alsatplg to -# "Object.Pipeline.host-gateway-src-mfcc-capture.N.attribute_name". +# "Object.Pipeline.host-gateway-src-micsel-mfcc-capture.N.attribute_name". # -# Usage: host-gateway-src-mfcc-capture pipeline object can be instantiated as: +# Usage: host-gateway-src-micsel-mfcc-capture pipeline object can be instantiated as: # -# Object.Pipeline.host-gateway-src-mfcc-capture."N" { +# Object.Pipeline.host-gateway-src-micsel-mfcc-capture."N" { # period 1000 # time_domain "timer" # } @@ -20,9 +20,10 @@ + -Class.Pipeline."host-gateway-src-mfcc-capture" { +Class.Pipeline."host-gateway-src-micsel-mfcc-capture" { @@ -32,8 +33,8 @@ Class.Pipeline."host-gateway-src-mfcc-capture" { ] # - # host-gateway-src-mfcc-capture objects instantiated within the same alsaconf - # node must have unique pipeline_id attribute + # host-gateway-src-micsel-mfcc-capture objects instantiated within the + # same alsaconf node must have unique pipeline_id attribute # unique "instance" } @@ -70,6 +71,27 @@ Class.Pipeline."host-gateway-src-mfcc-capture" { ] } + micsel."1" { + num_input_audio_formats 1 + num_output_audio_formats 1 + Object.Base.input_audio_format [ + { + in_bit_depth 32 + in_valid_bit_depth 32 + in_rate 16000 + } + ] + Object.Base.output_audio_format [ + { + out_bit_depth 32 + out_valid_bit_depth 32 + out_rate 16000 + out_channels 2 + out_ch_cfg $CHANNEL_CONFIG_DUAL_MONO + } + ] + } + mfcc."1" { num_input_audio_formats 1 num_output_audio_formats 1 @@ -123,6 +145,10 @@ Class.Pipeline."host-gateway-src-mfcc-capture" { !route [ { source src.$index.1 + sink micsel.$index.1 + } + { + source micsel.$index.1 sink mfcc.$index.1 } ] diff --git a/tools/topology/topology2/platform/intel/sdw-dmic-audio-feature.conf b/tools/topology/topology2/platform/intel/sdw-dmic-audio-feature.conf index 87039b261597..a7baa1d283b7 100644 --- a/tools/topology/topology2/platform/intel/sdw-dmic-audio-feature.conf +++ b/tools/topology/topology2/platform/intel/sdw-dmic-audio-feature.conf @@ -6,7 +6,7 @@ Define { SDW_DMIC_AUDIO_FEATURE_CAPTURE_PIPELINE_ID 131 } -Object.Pipeline.host-gateway-src-mfcc-capture [ +Object.Pipeline.host-gateway-src-micsel-mfcc-capture [ { index $SDW_DMIC_AUDIO_FEATURE_CAPTURE_PIPELINE_ID @@ -15,6 +15,15 @@ Object.Pipeline.host-gateway-src-mfcc-capture [ pcm_id $SDW_DMIC_AUDIO_FEATURE_CAPTURE_PCM_ID } + Object.Widget.micsel.1 { + Object.Control { + bytes."1" { + name "$SDW_DMIC_AUDIO_FEATURE_CAPTURE_PCM_NAME Micsel bytes" + + } + } + } + Object.Widget.mfcc.1 { Object.Control { bytes."1" { diff --git a/tools/topology/topology2/platform/intel/sdw-jack-audio-feature.conf b/tools/topology/topology2/platform/intel/sdw-jack-audio-feature.conf index 9645199d6907..f50733c21c3a 100644 --- a/tools/topology/topology2/platform/intel/sdw-jack-audio-feature.conf +++ b/tools/topology/topology2/platform/intel/sdw-jack-audio-feature.conf @@ -6,7 +6,7 @@ Define { SDW_JACK_AUDIO_FEATURE_CAPTURE_PIPELINE_ID 130 } -Object.Pipeline.host-gateway-src-mfcc-capture [ +Object.Pipeline.host-gateway-src-micsel-mfcc-capture [ { index $SDW_JACK_AUDIO_FEATURE_CAPTURE_PIPELINE_ID @@ -15,6 +15,15 @@ Object.Pipeline.host-gateway-src-mfcc-capture [ pcm_id $SDW_JACK_AUDIO_FEATURE_CAPTURE_PCM_ID } + Object.Widget.micsel.1 { + Object.Control { + bytes."1" { + name "$SDW_JACK_AUDIO_FEATURE_CAPTURE_PCM_NAME Micsel bytes" + + } + } + } + Object.Widget.mfcc.1 { Object.Control { bytes."1" {