Skip to content

Commit bd52a5a

Browse files
committed
doc: update DMIC and WoV architecture Mermaid diagrams across all READMEs
Synchronize Mermaid architecture diagrams to reflect direct widget routing: - Add dedicated Dual-Rate DMIC & Multi-Slot WoV flowchart to tools/topology/topology2/README.md. - Update src/audio/ecns/README.md, src/audio/wov_arbiter/README.md, and doc/developer_guides/wov_ecns_integration_guide.md to eliminate intermediate mixin.115.1/mixin.115.2 and mixout.116.1/mixout.117.1 widgets. - Update src/audio/microwakeword/README.md to eliminate intermediate mixin.105.1/mixin.105.2 and mixout.106.1/mixout.107.1 widgets. - Show direct ECNS Pin 0 connection to KPB and ECNS Pin 1 connection to Host Copier (PCM 11 / PCM 10). Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
1 parent b2fc849 commit bd52a5a

5 files changed

Lines changed: 119 additions & 54 deletions

File tree

‎doc/developer_guides/wov_ecns_integration_guide.md‎

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,38 +60,27 @@ flowchart TD
6060
6161
ECNS["ecns.115.1 (Custom ECNS DP Module · 20ms Period)<br/>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br/><b>Pin 0 In:</b> 16 kHz, 2ch (IBS 1280 bytes)<br/><b>Pin 1 In:</b> 48 kHz, 2ch (IBS 3840 bytes)<br/>─────────────────────────────────<br/><b>Processing:</b><br/>• Pin 0: Extract Left Ch → 16k Mono Clean<br/>• Pin 1: 1-to-1 Stereo Copy → 48k Stereo Clean<br/>─────────────────────────────────<br/><b>Pin 0 Out:</b> 16 kHz, 1ch mono (OBS 640 bytes)<br/><b>Pin 1 Out:</b> 48 kHz, 2ch stereo (OBS 3840 bytes)"]
6262
63-
MIXIN_115_1["mixin.115.1 ('KPB mixin')<br/>(16 kHz · 1ch mono)"]
64-
MIXIN_115_2["mixin.115.2 ('Host mixin')<br/>(48 kHz · 2ch stereo)"]
65-
6663
MIXOUT_115_2 -->|"Pin 0 In (16k)"| ECNS
6764
MIXOUT_115_1 -->|"Pin 1 In (48k)"| ECNS
68-
69-
ECNS -->|"Pin 0 Out (Mono clean)"| MIXIN_115_1
70-
ECNS -->|"Pin 1 Out (Stereo clean)"| MIXIN_115_2
7165
end
7266
7367
MIXIN_119 --> MIXOUT_115_2
7468
MIXIN_110 --> MIXOUT_115_1
7569
7670
%% Pipeline 117: Host Capture PCM 11
7771
subgraph P117 ["Pipeline 117: ECNS Clean Host Capture (Core 0, LL 1ms)"]
78-
MIXOUT_117["mixout.117.1<br/>(48 kHz · 2ch stereo)"]
7972
HOST_11["host-copier.11.capture<br/>(PCM 11: hw:0,11)<br/>2ch Stereo Clean Speech<br/>capture_compatible_d0i3: true"]
80-
MIXOUT_117 --> HOST_11
8173
end
8274
83-
MIXIN_115_2 --> MIXOUT_117
84-
8575
%% Pipeline 116: KPB History Buffer
8676
subgraph P116 ["Pipeline 116: KPB History Buffer (Core 0, DP 20ms)"]
87-
MIXOUT_116["mixout.116.1<br/>(16 kHz · 1ch mono)"]
8877
KPB["kpb.116.1<br/>(2.0s mono circular history = 64 KB)"]
8978
MIXIN_116["mixin.116.1<br/>(Fan-out Bus)"]
90-
MIXOUT_116 --> KPB
9179
KPB -->|"Pin 0 (Live Feed)"| MIXIN_116
9280
end
9381
94-
MIXIN_115_1 --> MIXOUT_116
82+
ECNS -->|"Pin 1 (Stereo 48k clean direct)"| HOST_11
83+
ECNS -->|"Pin 0 (Mono 16k clean direct)"| KPB
9584
9685
%% WOV Keyword Spotter Slots
9786
subgraph WOV_Slots ["Pipelines 111–113: Concurrent WOV Keyword Spotters (Core 0, DP 10ms)"]

‎src/audio/ecns/README.md‎

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,38 +51,27 @@ flowchart TD
5151
5252
ECNS["ecns.115.1 (DP Component · 20ms Period)<br/>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br/><b>Pin 0 In:</b> 16 kHz, 2ch (IBS 1280 bytes)<br/><b>Pin 1 In:</b> 48 kHz, 2ch (IBS 3840 bytes)<br/>─────────────────────────────<br/><b>Processing:</b><br/>• Pin 0: Extract Left Ch → 16k Mono Clean<br/>• Pin 1: 1-to-1 Stereo Copy → 48k Stereo Clean<br/>─────────────────────────────<br/><b>Pin 0 Out:</b> 16 kHz, 1ch mono (OBS 640 bytes)<br/><b>Pin 1 Out:</b> 48 kHz, 2ch stereo (OBS 3840 bytes)"]
5353
54-
MIXIN_115_1["mixin.115.1 ('KPB mixin')<br/>(16 kHz · 1ch mono)"]
55-
MIXIN_115_2["mixin.115.2 ('Host mixin')<br/>(48 kHz · 2ch stereo)"]
56-
5754
MIXOUT_115_2 -->|"Pin 0 In (16k)"| ECNS
5855
MIXOUT_115_1 -->|"Pin 1 In (48k)"| ECNS
59-
60-
ECNS -->|"Pin 0 Out (Mono clean)"| MIXIN_115_1
61-
ECNS -->|"Pin 1 Out (Stereo clean)"| MIXIN_115_2
6256
end
6357
6458
MIXIN_119 --> MIXOUT_115_2
6559
MIXIN_110 --> MIXOUT_115_1
6660
6761
%% Pipeline 117: Host Capture PCM 11
6862
subgraph P117 ["Pipeline 117: ECNS Clean Host Capture (Core 0, LL 1ms)"]
69-
MIXOUT_117["mixout.117.1<br/>(48 kHz · 2ch stereo)"]
7063
HOST_11["host-copier.11.capture<br/>(PCM 11: 'DMIC ECNS Capture'<br/>hw:0,11 · d0i3_compatible=true)"]
71-
MIXOUT_117 --> HOST_11
7264
end
7365
74-
MIXIN_115_2 --> MIXOUT_117
75-
7666
%% Pipeline 116: KPB History Buffer
7767
subgraph P116 ["Pipeline 116: Key Phrase Buffer (Core 0, DP 20ms)"]
78-
MIXOUT_116["mixout.116.1<br/>(16 kHz · 1ch mono)"]
7968
KPB["kpb.116.1<br/>(2000 ms mono history = 64 KB)"]
8069
MIXIN_116["mixin.116.1<br/>(3-way detector fanout)"]
81-
MIXOUT_116 --> KPB
8270
KPB -->|"Pin 0 (Live Feed)"| MIXIN_116
8371
end
8472
85-
MIXIN_115_1 --> MIXOUT_116
73+
ECNS -->|"Pin 1 Out (Stereo 48k clean direct)"| HOST_11
74+
ECNS -->|"Pin 0 Out (Mono 16k clean direct)"| KPB
8675
8776
%% WoV 3-Slot Detector Subgraph
8877
subgraph SLOTS ["Wake-on-Voice Keyword Detector Slots (16 kHz mono)"]

‎src/audio/microwakeword/README.md‎

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,13 @@ graph TD
3131
subgraph P105["Pipeline 105 — ECNS DP Processing (Core 0, DP 20ms)"]
3232
MO105["mixout 105.1\n(4ch input)"]
3333
ECNS["ecns.105.1\n(ECNS DP Module, 20ms = 320 frames)\nCh 0,1: Mic | Ch 2,3: Echo Ref"]
34-
MIX105_1["mixin 105.1\nPin 0: Ch 0 Mono Clean"]
35-
MIX105_2["mixin 105.2\nPin 1: Ch 0,1 Stereo Clean"]
3634
MO105 --> ECNS
37-
ECNS -- "Pin 0 (Mono)" --> MIX105_1
38-
ECNS -- "Pin 1 (Stereo)" --> MIX105_2
3935
end
4036
4137
subgraph P106["Pipeline 106 — KPB History Buffer (Core 0, DP 20ms)"]
42-
MO106["mixout 106.1\n(1ch mono)"]
43-
KPB["kpb.106.1\n(2.0s mono history = 64 KB)\n16 kHz · 1ch · S16_LE"]
38+
KPB["kpb.106.1\n(2.0s mono history = 64 KB)\n16 kHz · 1ch · S16_LE\nPin 0: sel_sink | Pin 1: host_sink"]
4439
MIX106["mixin 106.1\n(3-way fanout mixin)"]
45-
MO106 --> KPB --> MIX106
40+
KPB -- "Pin 0 (sel_sink)" --> MIX106
4641
end
4742
4843
subgraph P101["Pipeline 101 — Slot 0: 'strawberry' (Core 0, DP 10ms)"]
@@ -67,27 +62,26 @@ graph TD
6762
end
6863
6964
subgraph P104["Pipeline 104 — WOV Host PCM Capture (Core 0, LL 1ms)"]
70-
ARB["wov-arbiter.104.1\n(3 input pins, 1 output pin\n1ch mono 16 kHz)"]
65+
ARB["wov-arbiter.104.1\n(4 input pins, 1 output pin\nPin 0: Audio | Pins 1-3: Features\n1ch mono 16 kHz S16_LE)"]
7166
HC11["host-copier.11\n(hw:0,11 · PCM 11)\n1ch · 16 kHz · S16_LE / S32_LE"]
7267
ARB --> HC11
7368
end
7469
7570
subgraph P107["Pipeline 107 — ECNS Host PCM Capture (Core 0, LL 1ms)"]
76-
MO107["mixout 107.1\n(2ch stereo)"]
7771
HC10["host-copier.10\n(hw:0,10 · PCM 10)\n2ch · 16 kHz · S16_LE / S32_LE"]
78-
MO107 --> HC10
7972
end
8073
8174
MIX100 --> MO105
82-
MIX105_1 --> MO106
83-
MIX105_2 --> MO107
75+
ECNS -- "Pin 0 (Mono Clean direct)" --> KPB
76+
ECNS -- "Pin 1 (Stereo Clean direct)" --> HC10
8477
MIX106 --> MO101
8578
MIX106 --> MO102
8679
MIX106 --> MO103
8780
88-
MWW0 --> ARB
89-
MWW1 --> ARB
90-
MWW2 --> ARB
81+
KPB -- "Pin 1 (host_sink / drain audio)" --> ARB
82+
MWW0 -->|"Pin 1 (Features)"| ARB
83+
MWW1 -->|"Pin 2 (Features)"| ARB
84+
MWW2 -->|"Pin 3 (Features)"| ARB
9185
9286
MWW0 -. "Notifier WOV_DETECT (slot=0)" .-> ARB
9387
MWW1 -. "Notifier WOV_DETECT (slot=1)" .-> ARB

‎src/audio/wov_arbiter/README.md‎

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,38 +80,27 @@ flowchart TD
8080
8181
ECNS["ecns.115.1 (DP Component · 20ms Period)<br/>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br/><b>Pin 0 In:</b> 16 kHz, 2ch (IBS 1280 bytes)<br/><b>Pin 1 In:</b> 48 kHz, 2ch (IBS 3840 bytes)<br/>─────────────────────────────<br/><b>Processing:</b><br/>• Pin 0: Extract Left Ch → 16k Mono Clean<br/>• Pin 1: 1-to-1 Stereo Copy → 48k Stereo Clean<br/>─────────────────────────────<br/><b>Pin 0 Out:</b> 16 kHz, 1ch mono (OBS 640 bytes)<br/><b>Pin 1 Out:</b> 48 kHz, 2ch stereo (OBS 3840 bytes)"]
8282
83-
MIXIN_115_1["mixin.115.1 ('KPB mixin')<br/>(16 kHz · 1ch mono)"]
84-
MIXIN_115_2["mixin.115.2 ('Host mixin')<br/>(48 kHz · 2ch stereo)"]
85-
8683
MIXOUT_115_2 -->|"Pin 0 In (16k)"| ECNS
8784
MIXOUT_115_1 -->|"Pin 1 In (48k)"| ECNS
88-
89-
ECNS -->|"Pin 0 Out (Mono clean)"| MIXIN_115_1
90-
ECNS -->|"Pin 1 Out (Stereo clean)"| MIXIN_115_2
9185
end
9286
9387
MIXIN_119 --> MIXOUT_115_2
9488
MIXIN_110 --> MIXOUT_115_1
9589
9690
%% Pipeline 117: Host Capture PCM 11
9791
subgraph P117 ["Pipeline 117: ECNS Clean Host Capture (Core 0, LL 1ms)"]
98-
MIXOUT_117["mixout.117.1<br/>(48 kHz · 2ch stereo)"]
9992
HOST_11["host-copier.11.capture<br/>(PCM 11: 'DMIC ECNS Capture'<br/>hw:0,11 · d0i3_compatible=true)"]
100-
MIXOUT_117 --> HOST_11
10193
end
10294
103-
MIXIN_115_2 --> MIXOUT_117
104-
10595
%% Pipeline 116: KPB History Buffer
10696
subgraph P116 ["Pipeline 116: Key Phrase Buffer (Core 0, DP 20ms)"]
107-
MIXOUT_116["mixout.116.1<br/>(16 kHz · 1ch mono)"]
10897
KPB["kpb.116.1<br/>(2000 ms mono history = 64 KB)"]
10998
MIXIN_116["mixin.116.1<br/>(3-way detector fanout)"]
110-
MIXOUT_116 --> KPB
11199
KPB -->|"Pin 0 (Live Feed)"| MIXIN_116
112100
end
113101
114-
MIXIN_115_1 --> MIXOUT_116
102+
ECNS -->|"Pin 1 Out (Stereo 48k clean direct)"| HOST_11
103+
ECNS -->|"Pin 0 Out (Mono 16k clean direct)"| KPB
115104
116105
%% WoV 3-Slot Detector Subgraph
117106
subgraph SLOTS ["Wake-on-Voice Keyword Detector Slots (16 kHz mono)"]

‎tools/topology/topology2/README.md‎

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,110 @@ The **`sof-wcl-rt721-4ch-wov-multi.tplg`** (and corresponding PTL variant `sof-p
619619
- 4-pin WOV Arbiter (`wov-arbiter.114.1`, Pipeline 114) with active slot selection, host wake support, and audio history stream delivery (`PCM 12`, `DMIC Multi-WOV`, 1ch 16 kHz, `capture_compatible_d0i3: true`).
620620
- *Note*: DMIC raw `PCM 10` (Pipeline 118) has been completely removed to streamline pipeline topology and conserve DSP memory.
621621

622+
#### Dual-Rate DMIC & Multi-Slot WoV Architecture Diagram
623+
624+
The flowchart below details the dedicated dual-rate DMIC capture, 20ms DP ECNS audio processing, KPB circular buffering, 3-slot microWakeWord keyword detection, and WOV Arbiter routing directly to ALSA capture endpoints without intermediate mixin/mixout widgets:
625+
626+
```mermaid
627+
flowchart TD
628+
%% Hardware Digital Microphone Interfaces
629+
subgraph PDM_INTERFACES["Digital Microphone Interfaces (2 Separate PDM DAIs)"]
630+
direction LR
631+
PDM0["PDM Interface: dmic01\nDAI Index: 0 (PDM0)\nRate: 48 kHz · 2ch Stereo · 16-bit"]
632+
PDM1["PDM Interface: dmic16k\nDAI Index: 1 (PDM1)\nRate: 16 kHz · 2ch Stereo · 16-bit"]
633+
end
634+
635+
%% Pipeline 110: 48 kHz DAI Ingest
636+
subgraph P110["Pipeline 110 — 48 kHz DAI Ingest (Core 0, LL 1ms)"]
637+
DAI0["dai-copier.DMIC.dmic01.capture\n(48 kHz · 2ch · S16_LE)"]
638+
MIX110["mixin.110.1\n(48 kHz · 2ch)"]
639+
DAI0 --> MIX110
640+
end
641+
642+
%% Pipeline 119: 16 kHz DAI Ingest
643+
subgraph P119["Pipeline 119 — 16 kHz DAI Ingest (Core 0, LL 1ms)"]
644+
DAI1["dai-copier.DMIC.dmic16k.capture\n(16 kHz · 2ch · S16_LE)"]
645+
MIX119["mixin.119.1\n(16 kHz · 2ch)"]
646+
DAI1 --> MIX119
647+
end
648+
649+
PDM0 --> DAI0
650+
PDM1 --> DAI1
651+
652+
%% Pipeline 115: Dual-Rate ECNS DP Engine
653+
subgraph P115["Pipeline 115 — ECNS Processing Engine (Core 0, DP 20ms, lp_mode 1)"]
654+
direction TB
655+
MO115_1["mixout.115.1\n(Pin 1 In: 48 kHz · 2ch stereo)"]
656+
MO115_2["mixout.115.2\n(Pin 0 In: 16 kHz · 2ch stereo)"]
657+
ECNS["ecns.115.1 (Dual-Rate DP Module · 20ms Period)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nPin 0 In: 16 kHz, 2ch (IBS 1280B)\nPin 1 In: 48 kHz, 2ch (IBS 3840B)\n─────────────────────────────────────────\nProcessing:\n• Pin 0: Extract Left Ch -> 16k Mono Clean\n• Pin 1: 1-to-1 Stereo Copy -> 48k Stereo Clean\n─────────────────────────────────────────\nPin 0 Out: 16 kHz, 1ch mono (OBS 640B)\nPin 1 Out: 48 kHz, 2ch stereo (OBS 3840B)"]
658+
MO115_2 -->|"Pin 0 In (16k 2ch)"| ECNS
659+
MO115_1 -->|"Pin 1 In (48k 2ch)"| ECNS
660+
end
661+
662+
MIX119 --> MO115_2
663+
MIX110 --> MO115_1
664+
665+
%% Pipeline 117: Host Capture PCM 11 (Direct from ECNS Pin 1)
666+
subgraph P117["Pipeline 117 — ECNS Clean Host Capture (Core 0, LL 1ms)"]
667+
HOST11["host-copier.11.capture\n(PCM 11: 'DMIC ECNS Capture' · hw:0,11)\n2ch · 48 kHz · S16/S32_LE\ncapture_compatible_d0i3: true"]
668+
end
669+
670+
%% Pipeline 116: KPB History Buffer (Direct from ECNS Pin 0)
671+
subgraph P116["Pipeline 116 — 20ms DP KPB History Buffer (Core 0, DP 20ms)"]
672+
KPB["kpb.116.1\n(Key Phrase Buffer · 2000ms = 64 KB)\n16 kHz · 1ch mono · S16_LE\nPin 0: sel_sink | Pin 1: host_sink"]
673+
MIX116["mixin.116.1\n(3-way detector fanout bus)"]
674+
KPB -->|"Pin 0 (Live Audio Feed)"| MIX116
675+
end
676+
677+
ECNS -- "Pin 1 (Direct Stereo 48k Clean)" --> HOST11
678+
ECNS -- "Pin 0 (Direct Mono 16k Clean)" --> KPB
679+
680+
%% Pipelines 111-113: microWakeWord Detector Slots
681+
subgraph SLOTS["Pipelines 111–113 — microWakeWord Detector Slots (Core 0, DP 10ms)"]
682+
subgraph S0["Slot 0 (Pipeline 111)"]
683+
MO111["mixout.111.1"] --> MFCC0["mfcc.111.1\n(Mel-40 10ms)"] --> MWW0["mww.111.1\n(Model: Slot 0)\nControl: wovdebug_111"]
684+
end
685+
subgraph S1["Slot 1 (Pipeline 112)"]
686+
MO112["mixout.112.1"] --> MFCC1["mfcc.112.1\n(Mel-40 10ms)"] --> MWW1["mww.112.1\n(Model: Slot 1)\nControl: wovdebug_112"]
687+
end
688+
subgraph S2["Slot 2 (Pipeline 113)"]
689+
MO113["mixout.113.1"] --> MFCC2["mfcc.113.1\n(Mel-40 10ms)"] --> MWW2["mww.113.1\n(Model: Slot 2)\nControl: wovdebug_113"]
690+
end
691+
end
692+
693+
MIX116 --> MO111
694+
MIX116 --> MO112
695+
MIX116 --> MO113
696+
697+
%% Pipeline 114: WOV Arbiter & Multi-WOV Host Capture
698+
subgraph P114["Pipeline 114 — WOV Arbiter & Multi-WOV Host Capture (Core 0, LL 1ms)"]
699+
ARB["wov-arbiter.114.1\n(4-Pin Arbiter · Active Slot Routing)\nPin 0: Audio Drain | Pins 1-3: Trigger Features"]
700+
HOST12["host-copier.12.capture\n(PCM 12: 'DMIC Multi-WOV' · hw:0,12)\n1ch · 16 kHz · S16/S32_LE\ncapture_compatible_d0i3: true"]
701+
ARB --> HOST12
702+
end
703+
704+
KPB -->|"Pin 1 (2.0s History Pre-roll Drain)"| ARB
705+
MWW0 -->|"Pin 1 (Keyword Trigger 0)"| ARB
706+
MWW1 -->|"Pin 2 (Keyword Trigger 1)"| ARB
707+
MWW2 -->|"Pin 3 (Keyword Trigger 2)"| ARB
708+
709+
MWW0 -. "Notifier WOV_DETECT (slot=0)" .-> ARB
710+
MWW1 -. "Notifier WOV_DETECT (slot=1)" .-> ARB
711+
MWW2 -. "Notifier WOV_DETECT (slot=2)" .-> ARB
712+
MWW0 -. "Notifier KPB_CLIENT_EVT (DRAIN 2s)" .-> KPB
713+
MWW1 -. "Notifier KPB_CLIENT_EVT (DRAIN 2s)" .-> KPB
714+
MWW2 -. "Notifier KPB_CLIENT_EVT (DRAIN 2s)" .-> KPB
715+
ARB -. "Notifier WOV_CTRL (PAUSE/RESUME)" .-> MWW0
716+
ARB -. "Notifier WOV_CTRL (PAUSE/RESUME)" .-> MWW1
717+
ARB -. "Notifier WOV_CTRL (PAUSE/RESUME)" .-> MWW2
718+
719+
style ECNS fill:#1b4f72,stroke:#5dade2,color:#fff
720+
style KPB fill:#1c4966,stroke:#5dade2,color:#fff
721+
style ARB fill:#4a235a,stroke:#bb8fce,color:#fff
722+
style HOST11 fill:#1e8449,stroke:#58d68d,color:#fff
723+
style HOST12 fill:#2d5a27,stroke:#58d68d,color:#fff
724+
```
725+
622726
#### Full System Architecture Graph
623727

624728
```mermaid

0 commit comments

Comments
 (0)