Add macOS MMSE-Wiener spectral NR (MNR) + 5 dark-theme quick-wins#1
Closed
M7HNF-Ian wants to merge 1 commit into
Closed
Add macOS MMSE-Wiener spectral NR (MNR) + 5 dark-theme quick-wins#1M7HNF-Ian wants to merge 1 commit into
M7HNF-Ian wants to merge 1 commit into
Conversation
MNR uses a decision-directed MMSE-Wiener filter with minimum-statistics noise floor tracking, accelerated by Apple Accelerate (vDSP / AMX). 512-point FFT at 24 kHz, 50% overlap-add, per-bin gain with temporal smoothing to suppress musical noise. Hardware-accelerated on Apple Silicon. Right-click the MNR button to open strength controls in DSP Settings. Quick-wins: - aethersdr#1503: Diversity button missing on Slice A at startup - aethersdr#1581: TNF/FDX indicators invisible in dark theme - aethersdr#1583: Date/Time status bar labels too dim - aethersdr#1576: Record/Playback buttons invisible in dark theme - aethersdr#506: Secondary text colour consistency (#506070 → #8aa8c0) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Owner
Author
|
Closing — PR being submitted to upstream ten9876/AetherSDR instead. |
M7HNF-Ian
added a commit
that referenced
this pull request
Apr 19, 2026
#1 (bug) — mutual exclusion: setMnrEnabled now disables all other NR modes before enabling MNR; every other NR setter (NR2/RN2/NR4/BNR/DFNR) now also calls setMnrEnabled(false) in its mutual-exclusion block. aethersdr#2 (bug) — RADE guard: setMnrEnabled early-returns when m_radeMode is active, matching the pattern used by all other NR setters. aethersdr#3 — raw pointer → std::unique_ptr<MacNRFilter>: AudioEngine.h gains a forward declaration (#ifdef __APPLE__) and unique_ptr member; AudioEngine.cpp already had the full include; new/delete replaced with make_unique/reset. std::atomic<float> m_mnrStrength replaces plain float. aethersdr#5 — MacNRFilter.h: processing-chain comment corrected from "stereo int16 → … → stereo int16" to "stereo float32 → … → stereo float32"; also fixes the process() doc-comment. aethersdr#6 — MacNRFilter: m_strength changed to std::atomic<float>; setStrength/ strength() use store/load; processFrame() reads m_strength.load(). Allows AudioEngine to write strength from the audio thread while the DSP dialog reads it from the UI thread without a data race. aethersdr#8 — strength persistence: setMnrEnabled(true) restores m_mnrStrength from AppSettings("MnrStrength"); setMnrStrength() now saves to AppSettings on every change, so the value survives restarts. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
M7HNF-Ian
added a commit
that referenced
this pull request
Apr 19, 2026
before enabling MNR; every other NR setter (NR2/RN2/NR4/BNR/DFNR) now
also calls setMnrEnabled(false) in its mutual-exclusion block.
matching the pattern used by all other NR setters.
forward declaration (#ifdef __APPLE__) and unique_ptr member; AudioEngine.cpp
already had the full include; new/delete replaced with make_unique/reset.
std::atomic<float> m_mnrStrength replaces plain float.
"stereo int16 → … → stereo int16" to "stereo float32 → … → stereo float32";
also fixes the process() doc-comment.
strength() use store/load; processFrame() reads m_strength.load().
Allows AudioEngine to write strength from the audio thread while the
DSP dialog reads it from the UI thread without a data race.
AppSettings("MnrStrength"); setMnrStrength() now saves to AppSettings
on every change, so the value survives restarts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
MNR — macOS MMSE-Wiener Spectral Noise Reduction
Adds a new client-side noise reduction mode exclusive to macOS, accelerated by Apple's Accelerate framework (vDSP / AMX on Apple Silicon).
MNR uses a decision-directed MMSE-Wiener filter with minimum-statistics noise floor tracking. Unlike the radio-side NR (which applies a single scalar to the whole spectrum) or RNNoise (which is speech-optimised), MNR works per-bin in the frequency domain — it estimates the noise power at each of the 257 spectral bins independently and applies a customised Wiener gain to suppress only the bins that contain noise, leaving signal-bearing bins untouched.
Key characteristics:
vDSP_fft_zripuses AMX co-processor on Apple Silicon; the whole pipeline runs in ~0.3 ms per hop on M-series chipsThe MNR button appears in both the VFO widget DSP tab and the spectrum overlay DSP panel. On non-Apple builds it is hidden at compile time — zero overhead for Windows/Linux users. Right-clicking the MNR button opens the DSP Settings dialog directly on the MNR tab.
Quick-wins bundled in this PR
#00e060(bright green), inactive from near-black to#404858#8aa8c0#d04040, playback green to#70b070, disabled grey to#505050#8aa8c0(was#506070/#607080— unreadably dark on the#0f0f1abackground)Test plan
🤖 Generated with Claude Code