diff --git a/src/audio.c b/src/audio.c index b9364d6..71c47e0 100644 --- a/src/audio.c +++ b/src/audio.c @@ -204,10 +204,16 @@ static float* BuildSelectionAudio(int* outNumSamples) if (!regionSamples) return NULL; memcpy(regionSamples, app.signal.samples + startSample, numSamples * sizeof(float)); - float maxFreq = (float)app.signal.sampleRate / 2.0f; + // sel.freq* are fractions of the *displayed* axis (capped at + // EffectiveMaxFreqHz), not of true Nyquist — same convention the PNG export + // in ui.c uses. Convert through EffectiveMaxFreqHz so a display crop doesn't + // scale the passband up by 1/DisplayFreqFraction(). The filter itself still + // works in true-Nyquist terms, which is what nyquist is for. + float nyquist = (float)app.signal.sampleRate / 2.0f; + float maxFreq = EffectiveMaxFreqHz(); float freqLow = app.sel.freqStart * maxFreq; float freqHigh = app.sel.freqEnd * maxFreq; - if (freqLow > 10.0f || freqHigh < maxFreq - 10.0f) { + if (freqLow > 10.0f || freqHigh < nyquist - 10.0f) { TraceLog(LOG_INFO, "Applying bandpass filter: %.0f - %.0f Hz", freqLow, freqHigh); ApplyBandpassFilter(regionSamples, numSamples, app.signal.sampleRate, freqLow, freqHigh); } @@ -257,7 +263,7 @@ void ExportSelectionWAV(const char* dirPath) return; } - float maxFreq = (float)app.signal.sampleRate / 2.0f; + float maxFreq = EffectiveMaxFreqHz(); // sel.freq* are display-axis fractions float t0 = app.sel.timeStart * app.signal.duration; float t1 = app.sel.timeEnd * app.signal.duration; float f0 = app.sel.freqStart * maxFreq;