This code accompanies the paper "Cyclic multichannel Wiener filter for acoustic beamforming", accepted in WASPAA 2025 (arXiv: https://arxiv.org/abs/2507.10159).
Check also our follow-up work, where almost-periodic noises are suppressed using a cyclic MVDR: https://github.com/Screeen/cmvdr.
The paper proposes a new beamforming method leveraging the cyclostationarity of voiced speech signals.
By exploiting correlations across microphones and frequency components, the cyclic multichannel Wiener filter (cMWF)
improves noise reduction in low-SNR scenarios.
- Python 3.9 (for compatibility with librosa)
- Tested on macOS 14.4.1 but should run on most Linux systems.
- Clone the repository:
git clone git@github.com:Screeen/cyclicMWF.git
cd cyclicMWF- Create and activate a Python virtual environment:
python3.9 -m venv .venv
source .venv/bin/activate- Install required packages:
pip install --upgrade pip
uv sync # requires the `uv` package for managing virtual environments
# (or if you prefer:)
# pip install -r requirements.txtWe use the fastF0Nls library for pitch estimation, which requires compilation. See https://github.com/jkjaer/fastF0Nls for instructions.
Experiment parameters are controlled via YAML files in the configs/ folder. Edit default.yaml and cmwf.yaml to set your desired parameters such as:
data_type(choose from 'synthetic', 'instruments', or 'speech')num_montecarlo_simulations- ...
Run synthetic data experiments:
python main.py- Real data experiments require downloading room impulse responses, clean speech, and instrument samples:
- RIRs: https://www.iks.rwth-aachen.de/en/research/tools-downloads/databases/multi-channel-impulse-response-database/
- Instrument samples: https://theremin.music.uiowa.edu/MIS.html.
- Speech: Speech Intelligibility CD by Neil Thompson Shade
If you get
ImportError: cannot import name 'kaiser' from 'scipy.signal' (.../.venv/lib/python3.X/site-packages/scipy/signal/__init__.py). Did you mean: 'kaiserord'?
Open the file
nano .../SVD-direct/env/lib/python3.X/site-packages/pysepm/util.py
and replace
from scipy.signal import firls,kaiser,upfirdn
with
from scipy.signal import firls,upfirdn
from scipy.signal.windows import kaiser
Note
Feedback and questions welcome: G.Bologni@tudelft.nl. Enjoy experimenting with cMWF!
