Skip to content

Screeen/cMWF

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Cyclic multichannel Wiener filter (cMWF) for acoustic beamforming

Introduction

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.

Overview of results on synthetic data

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.


Installation and first run

Prerequisites

  • Python 3.9 (for compatibility with librosa)
  • Tested on macOS 14.4.1 but should run on most Linux systems.

Setup

  1. Clone the repository:
   git clone git@github.com:Screeen/cyclicMWF.git
   cd cyclicMWF
  1. Create and activate a Python virtual environment:
   python3.9 -m venv .venv
   source .venv/bin/activate
  1. 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.txt

fast_nls_src compilation

We use the fastF0Nls library for pitch estimation, which requires compilation. See https://github.com/jkjaer/fastF0Nls for instructions.


Running experiments

Configurations

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
  • ...

Example runs

Run synthetic data experiments:

python main.py

Notes

Troubleshooting

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!

About

Official repo for paper "Cyclic multichannel Wiener filter for acoustic beamforming".

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published