Array Post-Filtering¶
MVDR beamforming does not provide the optimal solution in a sense of the minimum mean square error (MMSE). The MMSE can be achieved with the MVDR beamformer followed by array post-filtering [SBM01]. In BTK, it can be done by inserting the post-filter feature pointer object object between beamformer and synthesis filter bank objects in Fig. 2. The BTK provides the following array post-filters.
Zelinski Post-Filtering¶
The effect of the Zelinski post-filters is thoroughly investigated in [SBM01]. SD beamforming and Zelinski post-filtering can be done with unit_test/test_online_beamforming in the BTK Git repository.
$ cd ${YOUR_GIT_REPOSITORY}/unit_test
$ python test_online_beamforming.py \
-c confs/sd_and_zelinski.json \
-i data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c1.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c2.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c3.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c4.wav \
-o out/U1001_1M_sdz.wav
This processes 4-channel input and store output as “out/U1001_1M_sdz.wav”.
McCowan Post-Filtering¶
McCowan post-filtering can provide a more optimum solution for the diffuse noise field [MB03]. You can run McCowan post-filtering as follows.
$ cd ${YOUR_GIT_REPOSITORY}/unit_test
$ python test_online_beamforming.py \
-c confs/sd_and_mccowan.json \
-i data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c1.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c2.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c3.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c4.wav \
-o out/U1001_1M_sdm.wav
Lefkimmiatis Post-Filtering¶
According to [LM07], McCowan’s method is sub-optimum in the diffuse noise field. You can try out Lefkimmiatis post-filtering as follows.
$ cd ${YOUR_GIT_REPOSITORY}/unit_test
$ python test_online_beamforming.py \
-c confs/sd_and_lefkimmiatis.json \
-i data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c1.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c2.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c3.wav \
data/CMU/R1/M1005/KINECT/RAW/segmented/U1001_1M_16k_b16_c4.wav \
-o out/U1001_1M_sdl.wav
Tip
As reported in [SKMC12], those post-filters may not be effective under a mismatched noise field assumption.