1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-16 08:34:10 +02:00
audacity/src/effects/NoiseRemoval.h
James Crook 466e9c179e Create ComponentInterface
It combines the old IdentInterface with the ParamsInterface, providing an identifier and parameters (if needed).
The main purpose of the change is to make the class hierarchy (as viewed via doxygen) much easier to follow.
2018-11-02 17:04:43 +00:00

205 lines
5.2 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
NoiseRemoval.h
Dominic Mazzoni
Vaughan Johnson (Preview)
**********************************************************************/
#ifndef __AUDACITY_EFFECT_NOISE_REMOVAL__
#define __AUDACITY_EFFECT_NOISE_REMOVAL__
#include "../Audacity.h"
#include "../Experimental.h"
#if !defined(EXPERIMENTAL_NOISE_REDUCTION)
#include "Effect.h"
#include "../MemoryX.h"
#include "../SampleFormat.h"
#include <wx/dialog.h>
#include <wx/slider.h>
class wxButton;
class wxSizer;
class wxString;
class Envelope;
class WaveTrack;
class wxRadioButton;
class wxTextCtrl;
#include "../RealFFTf.h"
#define NOISEREMOVAL_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Noise Removal") }
class EffectNoiseRemoval final : public Effect
{
public:
EffectNoiseRemoval();
virtual ~EffectNoiseRemoval();
// ComponentInterface implementation
ComponentInterfaceSymbol GetSymbol() override;
wxString GetDescription() override;
// EffectDefinitionInterface implementation
EffectType GetType() override;
bool SupportsAutomation() override;
// Effect implementation
bool PromptUser(wxWindow *parent) override;
bool Init() override;
bool CheckWhetherSkipEffect() override;
bool Process() override;
void End() override;
private:
bool mDoProfile;
bool mHasProfile;
int mLevel;
// Parameters chosen before the first phase
double mSampleRate;
size_t mWindowSize;
size_t mSpectrumSize;
float mMinSignalTime; // in secs
// The frequency-indexed noise threshold derived during the first
// phase of analysis
Floats mNoiseThreshold; // length is mSpectrumSize
// Parameters that affect the noise removal, regardless of how the
// noise profile was extracted
double mSensitivity;
double mFreqSmoothingHz;
double mNoiseGain; // in dB, should be negative
double mAttackDecayTime; // in secs
bool mbLeaveNoise;
bool ProcessOne(int count, WaveTrack * track,
sampleCount start, sampleCount len);
void Initialize();
void StartNewTrack();
void ProcessSamples(size_t len, float *buffer);
void FillFirstHistoryWindow();
void ApplyFreqSmoothing(float *spec);
void GetProfile();
void RemoveNoise();
void RotateHistoryWindows();
void FinishTrack();
// Variables that only exist during processing
std::unique_ptr<WaveTrack> mOutputTrack;
sampleCount mInSampleCount;
sampleCount mOutSampleCount;
int mInputPos;
HFFT hFFT;
Floats mFFTBuffer; // mWindowSize
Floats mWindow; // mWindowSize
int mFreqSmoothingBins;
int mAttackDecayBlocks;
float mOneBlockAttackDecay;
float mNoiseAttenFactor;
float mSensitivityFactor;
size_t mMinSignalBlocks;
size_t mHistoryLen;
Floats mInWaveBuffer; // mWindowSize
Floats mOutOverlapBuffer; // mWindowSize
ArraysOf<float> mSpectrums; // mHistoryLen x mSpectrumSize
ArraysOf<float> mGains; // mHistoryLen x mSpectrumSize
ArraysOf<float> mRealFFTs; // mHistoryLen x mWindowSize
ArraysOf<float> mImagFFTs; // mHistoryLen x mWindowSize
friend class NoiseRemovalDialog;
};
// WDR: class declarations
//----------------------------------------------------------------------------
// NoiseRemovalDialog
//----------------------------------------------------------------------------
// Declare window functions
class NoiseRemovalDialog final : public EffectDialog
{
public:
// constructors and destructors
NoiseRemovalDialog(EffectNoiseRemoval * effect,
wxWindow *parent);
wxSizer *MakeNoiseRemovalDialog(bool call_fit = true,
bool set_sizer = true);
void PopulateOrExchange(ShuttleGui & S);
bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
private:
// handlers
void OnGetProfile( wxCommandEvent &event );
void OnKeepNoise( wxCommandEvent &event );
void OnPreview(wxCommandEvent &event);
void OnRemoveNoise( wxCommandEvent &event );
void OnCancel( wxCommandEvent &event );
void OnSensitivityText(wxCommandEvent & event);
void OnGainText(wxCommandEvent & event);
void OnFreqText(wxCommandEvent & event);
void OnTimeText(wxCommandEvent & event);
void OnSensitivitySlider(wxCommandEvent & event);
void OnGainSlider(wxCommandEvent & event);
void OnFreqSlider(wxCommandEvent & event);
void OnTimeSlider(wxCommandEvent & event);
public:
EffectNoiseRemoval * m_pEffect;
wxButton * m_pButton_GetProfile;
wxButton * m_pButton_Preview;
wxButton * m_pButton_RemoveNoise;
wxRadioButton *mKeepSignal;
wxRadioButton *mKeepNoise;
wxSlider *mSensitivityS;
wxSlider *mGainS;
wxSlider *mFreqS;
wxSlider *mTimeS;
wxTextCtrl *mSensitivityT;
wxTextCtrl *mGainT;
wxTextCtrl *mFreqT;
wxTextCtrl *mTimeT;
double mSensitivity;
double mGain;
double mFreq;
double mTime;
bool mbLeaveNoise;
private:
DECLARE_EVENT_TABLE()
};
#endif
#endif