Audacity 3.2.0
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
EffectNoiseReduction::Worker Class Referencefinal
Collaboration diagram for EffectNoiseReduction::Worker:
[legend]

Public Types

typedef EffectNoiseReduction::Settings Settings
 
typedef EffectNoiseReduction::Statistics Statistics
 

Public Member Functions

 Worker (EffectNoiseReduction &effect, const Settings &settings, Statistics &statistics)
 
 ~Worker ()
 
bool Process (eWindowFunctions inWindowType, eWindowFunctions outWindowType, TrackList &tracks, double mT0, double mT1)
 
void ApplyFreqSmoothing (FloatVector &gains)
 
void GatherStatistics (MyTransformer &transformer)
 
bool Classify (MyTransformer &transformer, unsigned nWindows, int band)
 
void ReduceNoise (MyTransformer &transformer)
 
void FinishTrackStatistics ()
 

Static Public Member Functions

static bool Processor (SpectrumTransformer &transformer)
 

Public Attributes

const bool mDoProfile
 
EffectNoiseReductionmEffect
 
const SettingsmSettings
 
StatisticsmStatistics
 
FloatVector mFreqSmoothingScratch
 
const size_t mFreqSmoothingBins
 
size_t mBinLow
 
size_t mBinHigh
 
const int mNoiseReductionChoice
 
const int mMethod
 
const double mNewSensitivity
 
float mOneBlockAttack
 
float mOneBlockRelease
 
float mNoiseAttenFactor
 
float mOldSensitivityFactor
 
unsigned mNWindowsToExamine
 
unsigned mCenter
 
unsigned mHistoryLen
 
unsigned mProgressTrackCount = 0
 
sampleCount mLen = 0
 
sampleCount mProgressWindowCount = 0
 

Detailed Description

Definition at line 293 of file NoiseReduction.cpp.

Member Typedef Documentation

◆ Settings

Definition at line 296 of file NoiseReduction.cpp.

◆ Statistics

Definition at line 297 of file NoiseReduction.cpp.

Constructor & Destructor Documentation

◆ Worker()

EffectNoiseReduction::Worker::Worker ( EffectNoiseReduction effect,
const Settings settings,
Statistics statistics 
)

Definition at line 835 of file NoiseReduction.cpp.

842
843, mEffect{ effect }
845, mStatistics{ statistics }
846
848, mFreqSmoothingBins{ size_t(std::max(0.0, settings.mFreqSmoothingBands)) }
849, mBinLow{ 0 }
851
854
855// Sensitivity setting is a base 10 log, turn it into a natural log
857{
858 const auto sampleRate = mStatistics.mRate;
859
860#ifdef SPECTRAL_EDIT_NOISE_REDUCTION
861 {
862 // mBinLow is inclusive, mBinHigh is exclusive, of
863 // the range of frequencies to affect. Include any
864 // bin that partly overlaps the selected range of frequencies.
865 const double bin = sampleRate / mWindowSize;
866 if (f0 >= 0.0 )
867 mBinLow = floor(f0 / bin);
868 if (f1 >= 0.0)
869 mBinHigh = ceil(f1 / bin);
870 }
871#endif
872
873 const double noiseGain = -settings.mNoiseGain;
874 const unsigned nAttackBlocks =
876 const unsigned nReleaseBlocks =
878 // Applies to amplitudes, divide by 20:
879 mNoiseAttenFactor = DB_TO_LINEAR(noiseGain);
880 // Apply to gain factors which apply to amplitudes, divide by 20:
881 mOneBlockAttack = DB_TO_LINEAR(noiseGain / nAttackBlocks);
882 mOneBlockRelease = DB_TO_LINEAR(noiseGain / nReleaseBlocks);
883 // Applies to power, divide by 10:
885
887 ? std::max(2, (int)(minSignalTime * sampleRate / mSettings.StepSize()))
889
891 wxASSERT(mCenter >= 1); // release depends on this assumption
892
893 if (mDoProfile)
894#ifdef OLD_METHOD_AVAILABLE
896#else
897 mHistoryLen = 1;
898#endif
899 else {
900 // Allow long enough queue for sufficient inspection of the middle
901 // and for attack processing
902 // See ReduceNoise()
903 mHistoryLen = std::max(mNWindowsToExamine, mCenter + nAttackBlocks);
904 }
905}
#define DB_TO_LINEAR(x)
Definition: MemoryX.h:337
static Settings & settings()
Definition: TrackInfo.cpp:69
EffectNoiseReduction & mEffect

References DB_TO_LINEAR, anonymous_namespace{NoiseReduction.cpp}::DM_OLD_METHOD, EffectNoiseReduction::Settings::mAttackTime, mBinHigh, mBinLow, mCenter, mDoProfile, mHistoryLen, anonymous_namespace{NoiseReduction.cpp}::minSignalTime, mMethod, mNoiseAttenFactor, EffectNoiseReduction::Settings::mNoiseGain, mNWindowsToExamine, EffectNoiseReduction::Settings::mOldSensitivity, mOldSensitivityFactor, mOneBlockAttack, mOneBlockRelease, EffectNoiseReduction::Statistics::mRate, EffectNoiseReduction::Settings::mReleaseTime, mSettings, mStatistics, anonymous_namespace{ClipSegmentTest.cpp}::sampleRate, settings(), EffectNoiseReduction::Settings::StepSize(), and EffectNoiseReduction::Settings::StepsPerWindow().

Here is the call graph for this function:

◆ ~Worker()

EffectNoiseReduction::Worker::~Worker ( )

Definition at line 717 of file NoiseReduction.cpp.

718{
719}

Member Function Documentation

◆ ApplyFreqSmoothing()

void EffectNoiseReduction::Worker::ApplyFreqSmoothing ( FloatVector gains)

Definition at line 802 of file NoiseReduction.cpp.

803{
804 // Given an array of gain mutipliers, average them
805 // GEOMETRICALLY. Don't multiply and take nth root --
806 // that may quickly cause underflows. Instead, average the logs.
807
808 if (mFreqSmoothingBins == 0)
809 return;
810
811 const auto spectrumSize = mSettings.SpectrumSize();
812
813 {
814 auto pScratch = mFreqSmoothingScratch.data();
815 std::fill(pScratch, pScratch + spectrumSize, 0.0f);
816 }
817
818 for (size_t ii = 0; ii < spectrumSize; ++ii)
819 gains[ii] = log(gains[ii]);
820
821 // ii must be signed
822 for (int ii = 0; ii < (int)spectrumSize; ++ii) {
823 const int j0 = std::max(0, ii - (int)mFreqSmoothingBins);
824 const int j1 = std::min(spectrumSize - 1, ii + mFreqSmoothingBins);
825 for(int jj = j0; jj <= j1; ++jj) {
826 mFreqSmoothingScratch[ii] += gains[jj];
827 }
828 mFreqSmoothingScratch[ii] /= (j1 - j0 + 1);
829 }
830
831 for (size_t ii = 0; ii < spectrumSize; ++ii)
832 gains[ii] = exp(mFreqSmoothingScratch[ii]);
833}
int min(int a, int b)

References min(), and EffectNoiseReduction::mSettings.

Here is the call graph for this function:

◆ Classify()

bool EffectNoiseReduction::Worker::Classify ( MyTransformer transformer,
unsigned  nWindows,
int  band 
)
inline

Definition at line 1008 of file NoiseReduction.cpp.

1010{
1011 switch (mMethod) {
1012#ifdef OLD_METHOD_AVAILABLE
1013 case DM_OLD_METHOD:
1014 {
1015 float min = NthWindow(0).mSpectrums[band];
1016 for (unsigned ii = 1; ii < nWindows; ++ii)
1017 min = std::min(min, NthWindow(ii).mSpectrums[band]);
1018 return
1019 min <= mOldSensitivityFactor * mStatistics.mNoiseThreshold[band];
1020 }
1021#endif
1022 // New methods suppose an exponential distribution of power values
1023 // in the noise; NEW sensitivity (which is nonnegative) is meant to be
1024 // the negative of a log of probability (so the log is nonpositive)
1025 // that noise strays above the threshold. Call that probability
1026 // 1 - F. The quantile function of an exponential distribution is
1027 // - log (1 - F) * mean. Thus simply multiply mean by sensitivity
1028 // to get the threshold.
1029 case DM_MEDIAN:
1030 // This method examines the window and all other windows
1031 // whose centers lie on or between its boundaries, and takes a median, to
1032 // avoid being fooled by up and down excursions into
1033 // either the mistake of classifying noise as not noise
1034 // (leaving a musical noise chime), or the opposite
1035 // (distorting the signal with a drop out).
1036 if (nWindows <= 3)
1037 // No different from second greatest.
1038 goto secondGreatest;
1039 else if (nWindows <= 5)
1040 {
1041 float greatest = 0.0, second = 0.0, third = 0.0;
1042 for (unsigned ii = 0; ii < nWindows; ++ii) {
1043 const float power = transformer.NthWindow(ii).mSpectrums[band];
1044 if (power >= greatest)
1045 third = second, second = greatest, greatest = power;
1046 else if (power >= second)
1047 third = second, second = power;
1048 else if (power >= third)
1049 third = power;
1050 }
1051 return third <= mNewSensitivity * mStatistics.mMeans[band];
1052 }
1053 else {
1054 // not implemented
1055 wxASSERT(false);
1056 return true;
1057 }
1058 secondGreatest:
1059 case DM_SECOND_GREATEST:
1060 {
1061 // This method just throws out the high outlier. It
1062 // should be less prone to distortions and more prone to
1063 // chimes.
1064 float greatest = 0.0, second = 0.0;
1065 for (unsigned ii = 0; ii < nWindows; ++ii) {
1066 const float power = transformer.NthWindow(ii).mSpectrums[band];
1067 if (power >= greatest)
1068 second = greatest, greatest = power;
1069 else if (power >= second)
1070 second = power;
1071 }
1072 return second <= mNewSensitivity * mStatistics.mMeans[band];
1073 }
1074 default:
1075 wxASSERT(false);
1076 return true;
1077 }
1078}
constexpr fastfloat_really_inline int32_t power(int32_t q) noexcept
Definition: fast_float.h:1454
MyWindow & NthWindow(int nn)

References anonymous_namespace{NoiseReduction.cpp}::DM_MEDIAN, anonymous_namespace{NoiseReduction.cpp}::DM_OLD_METHOD, anonymous_namespace{NoiseReduction.cpp}::DM_SECOND_GREATEST, min(), MyTransformer::MyWindow::mSpectrums, EffectNoiseReduction::mStatistics, MyTransformer::NthWindow(), and fast_float::detail::power().

Here is the call graph for this function:

◆ FinishTrackStatistics()

void EffectNoiseReduction::Worker::FinishTrackStatistics ( )

Definition at line 949 of file NoiseReduction.cpp.

950{
951 const auto windows = mStatistics.mTrackWindows;
952
953 // Combine averages in case of multiple profile tracks.
954 if (windows) {
955 const auto multiplier = mStatistics.mTotalWindows;
956 const auto denom = windows + multiplier;
957 for (size_t ii = 0, nn = mStatistics.mMeans.size(); ii < nn; ++ii) {
958 auto &mean = mStatistics.mMeans[ii];
959 auto &sum = mStatistics.mSums[ii];
960 mean = (mean * multiplier + sum) / denom;
961 // Reset for next track
962 sum = 0;
963 }
964 // Reset for next track
967 }
968}

References EffectNoiseReduction::mStatistics.

◆ GatherStatistics()

void EffectNoiseReduction::Worker::GatherStatistics ( MyTransformer transformer)

Definition at line 970 of file NoiseReduction.cpp.

971{
973
974 {
975 // NEW statistics
976 auto pPower = transformer.NthWindow(0).mSpectrums.data();
977 auto pSum = mStatistics.mSums.data();
978 for (size_t jj = 0; jj < mSettings.SpectrumSize(); ++jj) {
979 *pSum++ += *pPower++;
980 }
981 }
982
983#ifdef OLD_METHOD_AVAILABLE
984 // The noise threshold for each frequency is the maximum
985 // level achieved at that frequency for a minimum of
986 // mMinSignalBlocks blocks in a row - the max of a min.
987
988 auto finish = mHistoryLen;
989
990 {
991 // old statistics
992 auto pPower = NthWindow(0).mSpectrums.data();
993 auto pThreshold = mStatistics.mNoiseThreshold.data();
994 for (size_t jj = 0; jj < mSpectrumSize; ++jj) {
995 float min = *pPower++;
996 for (unsigned ii = 1; ii < finish; ++ii)
997 min = std::min(min, NthWindow(ii).mSpectrums[jj]);
998 *pThreshold = std::max(*pThreshold, min);
999 ++pThreshold;
1000 }
1001 }
1002#endif
1003}

References min(), EffectNoiseReduction::mSettings, MyTransformer::MyWindow::mSpectrums, EffectNoiseReduction::mStatistics, and MyTransformer::NthWindow().

Referenced by Processor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Process()

bool EffectNoiseReduction::Worker::Process ( eWindowFunctions  inWindowType,
eWindowFunctions  outWindowType,
TrackList tracks,
double  mT0,
double  mT1 
)

Definition at line 721 of file NoiseReduction.cpp.

724{
726 for (auto track : tracks.Selected<WaveTrack>()) {
728 if (track->GetRate() != mStatistics.mRate) {
729 if (mDoProfile)
731 XO("All noise profile data must have the same sample rate.") );
732 else
734 XO(
735"The sample rate of the noise profile must match that of the sound to be processed.") );
736 return false;
737 }
738
739 double trackStart = track->GetStartTime();
740 double trackEnd = track->GetEndTime();
741 double t0 = std::max(trackStart, inT0);
742 double t1 = std::min(trackEnd, inT1);
743
744 if (t1 > t0) {
745 auto start = track->TimeToLongSamples(t0);
746 auto end = track->TimeToLongSamples(t1);
747 const auto len = end - start;
748 mLen = len;
749 const auto extra =
751 // Adjust denominator for presence or absence of padding,
752 // which makes the number of windows visited either more or less
753 // than the number of window steps in the data.
754 if (mDoProfile)
755 mLen -= extra;
756 else
757 mLen += extra;
758
759 auto t0 = track->LongSamplesToTime(start);
760 auto tLen = track->LongSamplesToTime(len);
761 std::optional<WaveTrack::Holder> ppTempTrack;
762 std::optional<ChannelGroup::ChannelIterator<WaveChannel>> pIter;
763 WaveTrack *pFirstTrack{};
764 if (!mSettings.mDoProfile) {
765 ppTempTrack.emplace(track->EmptyCopy());
766 pFirstTrack = ppTempTrack->get();
767 pIter.emplace(pFirstTrack->Channels().begin());
768 }
769 for (const auto pChannel : track->Channels()) {
770 auto pOutputTrack = pIter ? *(*pIter)++ : nullptr;
771 MyTransformer transformer{ *this, pOutputTrack.get(),
772 !mSettings.mDoProfile, inWindowType, outWindowType,
775 };
776 if (!transformer
777 .Process(Processor, *pChannel, mHistoryLen, start, len))
778 return false;
780 }
781 if (ppTempTrack) {
782 TrackSpectrumTransformer::PostProcess(*pFirstTrack, len);
783 constexpr auto preserveSplits = true;
784 constexpr auto merge = true;
785 track->ClearAndPaste(
786 t0, t0 + tLen, **ppTempTrack, preserveSplits, merge);
787 }
788 }
789 }
790
791 if (mDoProfile) {
792 if (mStatistics.mTotalWindows == 0) {
794 XO("Selected noise profile is too short."));
795 return false;
796 }
797 }
798
799 return true;
800}
XO("Cut/Copy/Paste")
const auto tracks
bool Process(eWindowFunctions inWindowType, eWindowFunctions outWindowType, TrackList &tracks, double mT0, double mT1)
static bool Processor(SpectrumTransformer &transformer)
static int DoMessageBox(const EffectPlugin &plugin, const TranslatableString &message, long style=DefaultMessageBoxStyle, const TranslatableString &titleStr={})
static bool PostProcess(WaveTrack &outputTrack, sampleCount len)
Final flush and trimming of tail samples.
A Track that contains audio waveform data.
Definition: WaveTrack.h:203
const char * end(const char *str) noexcept
Definition: StringUtils.h:106

References EffectUIServices::DoMessageBox(), details::end(), min(), EffectNoiseReduction::mSettings, EffectNoiseReduction::mStatistics, TrackSpectrumTransformer::PostProcess(), EffectNoiseReduction::Process(), tracks, and XO().

Here is the call graph for this function:

◆ Processor()

bool EffectNoiseReduction::Worker::Processor ( SpectrumTransformer transformer)
static

Definition at line 918 of file NoiseReduction.cpp.

919{
920 auto &transformer = static_cast<MyTransformer &>(trans);
921 auto &worker = transformer.mWorker;
922 // Compute power spectrum in the newest window
923 {
924 auto &record = transformer.NthWindow(0);
925 float *pSpectrum = &record.mSpectrums[0];
926 const double dc = record.mRealFFTs[0];
927 *pSpectrum++ = dc * dc;
928 float *pReal = &record.mRealFFTs[1], *pImag = &record.mImagFFTs[1];
929 for (size_t nn = worker.mSettings.SpectrumSize() - 2; nn--;) {
930 const double re = *pReal++, im = *pImag++;
931 *pSpectrum++ = re * re + im * im;
932 }
933 const double nyquist = record.mImagFFTs[0];
934 *pSpectrum = nyquist * nyquist;
935 }
936
937 if (worker.mDoProfile)
938 worker.GatherStatistics(transformer);
939 else
940 worker.ReduceNoise(transformer);
941
942 // Update the Progress meter, let user cancel
943 return !worker.mEffect.TrackProgress(worker.mProgressTrackCount,
944 std::min(1.0,
945 ((++worker.mProgressWindowCount).as_double() *
946 worker.mSettings.StepSize()) / worker.mLen.as_double()));
947}

References GatherStatistics(), min(), and MyTransformer::mWorker.

Here is the call graph for this function:

◆ ReduceNoise()

void EffectNoiseReduction::Worker::ReduceNoise ( MyTransformer transformer)

Definition at line 1080 of file NoiseReduction.cpp.

1081{
1082 auto historyLen = transformer.CurrentQueueSize();
1083 auto nWindows = std::min<unsigned>(mNWindowsToExamine, historyLen);
1084
1085 const auto spectrumSize = mSettings.SpectrumSize();
1086
1088 {
1089 auto &record = transformer.NthWindow(0);
1090 // Default all gains to the reduction factor,
1091 // until we decide to raise some of them later
1092 float *pGain = &record.mGains[0];
1093 std::fill(pGain, pGain + spectrumSize, mNoiseAttenFactor);
1094 }
1095
1096 // Raise the gain for elements in the center of the sliding history
1097 // or, if isolating noise, zero out the non-noise
1098 if (nWindows > mCenter)
1099 {
1100 auto pGain = transformer.NthWindow(mCenter).mGains.data();
1102 // All above or below the selected frequency range is non-noise
1103 std::fill(pGain, pGain + mBinLow, 0.0f);
1104 std::fill(pGain + mBinHigh, pGain + spectrumSize, 0.0f);
1105 pGain += mBinLow;
1106 for (size_t jj = mBinLow; jj < mBinHigh; ++jj) {
1107 const bool isNoise = Classify(transformer, nWindows, jj);
1108 *pGain++ = isNoise ? 1.0 : 0.0;
1109 }
1110 }
1111 else {
1112 // All above or below the selected frequency range is non-noise
1113 std::fill(pGain, pGain + mBinLow, 1.0f);
1114 std::fill(pGain + mBinHigh, pGain + spectrumSize, 1.0f);
1115 pGain += mBinLow;
1116 for (size_t jj = mBinLow; jj < mBinHigh; ++jj) {
1117 const bool isNoise = Classify(transformer, nWindows, jj);
1118 if (!isNoise)
1119 *pGain = 1.0;
1120 ++pGain;
1121 }
1122 }
1123 }
1124
1126 {
1127 // In each direction, define an exponential decay of gain from the
1128 // center; make actual gains the maximum of mNoiseAttenFactor, and
1129 // the decay curve, and their prior values.
1130
1131 // First, the attack, which goes backward in time, which is,
1132 // toward higher indices in the queue.
1133 for (size_t jj = 0; jj < spectrumSize; ++jj) {
1134 for (unsigned ii = mCenter + 1; ii < historyLen; ++ii) {
1135 const float minimum =
1136 std::max(mNoiseAttenFactor,
1137 transformer.NthWindow(ii - 1).mGains[jj] * mOneBlockAttack);
1138 float &gain = transformer.NthWindow(ii).mGains[jj];
1139 if (gain < minimum)
1140 gain = minimum;
1141 else
1142 // We can stop now, our attack curve is intersecting
1143 // the release curve of some window previously processed.
1144 break;
1145 }
1146 }
1147
1148 // Now, release. We need only look one window ahead. This part will
1149 // be visited again when we examine the next window, and
1150 // carry the decay further.
1151 {
1152 auto pNextGain = transformer.NthWindow(mCenter - 1).mGains.data();
1153 auto pThisGain = transformer.NthWindow(mCenter).mGains.data();
1154 for (auto nn = mSettings.SpectrumSize(); nn--;) {
1155 *pNextGain =
1156 std::max(*pNextGain,
1157 std::max(mNoiseAttenFactor,
1158 *pThisGain++ * mOneBlockRelease));
1159 ++pNextGain;
1160 }
1161 }
1162 }
1163
1164
1165 if (transformer.QueueIsFull()) {
1166 auto &record = transformer.NthWindow(historyLen - 1); // end of the queue
1167 const auto last = mSettings.SpectrumSize() - 1;
1168
1170 // Apply frequency smoothing to output gain
1171 // Gains are not less than mNoiseAttenFactor
1172 ApplyFreqSmoothing(record.mGains);
1173
1174 // Apply gain to FFT
1175 {
1176 const float *pGain = &record.mGains[1];
1177 float *pReal = &record.mRealFFTs[1];
1178 float *pImag = &record.mImagFFTs[1];
1179 auto nn = mSettings.SpectrumSize() - 2;
1181 for (; nn--;) {
1182 // Subtract the gain we would otherwise apply from 1, and
1183 // negate that to flip the phase.
1184 const double gain = *pGain++ - 1.0;
1185 *pReal++ *= gain;
1186 *pImag++ *= gain;
1187 }
1188 record.mRealFFTs[0] *= (record.mGains[0] - 1.0);
1189 // The Fs/2 component is stored as the imaginary part of the DC component
1190 record.mImagFFTs[0] *= (record.mGains[last] - 1.0);
1191 }
1192 else {
1193 for (; nn--;) {
1194 const double gain = *pGain++;
1195 *pReal++ *= gain;
1196 *pImag++ *= gain;
1197 }
1198 record.mRealFFTs[0] *= record.mGains[0];
1199 // The Fs/2 component is stored as the imaginary part of the DC component
1200 record.mImagFFTs[0] *= record.mGains[last];
1201 }
1202 }
1203 }
1204}
void ApplyFreqSmoothing(FloatVector &gains)
bool Classify(MyTransformer &transformer, unsigned nWindows, int band)
size_t CurrentQueueSize() const
How many windows in the queue have been filled?

References SpectrumTransformer::CurrentQueueSize(), MyTransformer::MyWindow::mGains, EffectNoiseReduction::mSettings, anonymous_namespace{NoiseReduction.cpp}::NRC_ISOLATE_NOISE, anonymous_namespace{NoiseReduction.cpp}::NRC_LEAVE_RESIDUE, MyTransformer::NthWindow(), and SpectrumTransformer::QueueIsFull().

Here is the call graph for this function:

Member Data Documentation

◆ mBinHigh

size_t EffectNoiseReduction::Worker::mBinHigh

Definition at line 329 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mBinLow

size_t EffectNoiseReduction::Worker::mBinLow

Definition at line 328 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mCenter

unsigned EffectNoiseReduction::Worker::mCenter

Definition at line 341 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mDoProfile

const bool EffectNoiseReduction::Worker::mDoProfile

Definition at line 319 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mEffect

EffectNoiseReduction& EffectNoiseReduction::Worker::mEffect

Definition at line 321 of file NoiseReduction.cpp.

◆ mFreqSmoothingBins

const size_t EffectNoiseReduction::Worker::mFreqSmoothingBins

Definition at line 326 of file NoiseReduction.cpp.

◆ mFreqSmoothingScratch

FloatVector EffectNoiseReduction::Worker::mFreqSmoothingScratch

Definition at line 325 of file NoiseReduction.cpp.

◆ mHistoryLen

unsigned EffectNoiseReduction::Worker::mHistoryLen

Definition at line 342 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mLen

sampleCount EffectNoiseReduction::Worker::mLen = 0

Definition at line 346 of file NoiseReduction.cpp.

◆ mMethod

const int EffectNoiseReduction::Worker::mMethod

Definition at line 332 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mNewSensitivity

const double EffectNoiseReduction::Worker::mNewSensitivity

Definition at line 333 of file NoiseReduction.cpp.

◆ mNoiseAttenFactor

float EffectNoiseReduction::Worker::mNoiseAttenFactor

Definition at line 337 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mNoiseReductionChoice

const int EffectNoiseReduction::Worker::mNoiseReductionChoice

Definition at line 331 of file NoiseReduction.cpp.

◆ mNWindowsToExamine

unsigned EffectNoiseReduction::Worker::mNWindowsToExamine

Definition at line 340 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mOldSensitivityFactor

float EffectNoiseReduction::Worker::mOldSensitivityFactor

Definition at line 338 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mOneBlockAttack

float EffectNoiseReduction::Worker::mOneBlockAttack

Definition at line 335 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mOneBlockRelease

float EffectNoiseReduction::Worker::mOneBlockRelease

Definition at line 336 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mProgressTrackCount

unsigned EffectNoiseReduction::Worker::mProgressTrackCount = 0

Definition at line 345 of file NoiseReduction.cpp.

◆ mProgressWindowCount

sampleCount EffectNoiseReduction::Worker::mProgressWindowCount = 0

Definition at line 347 of file NoiseReduction.cpp.

◆ mSettings

const Settings& EffectNoiseReduction::Worker::mSettings

Definition at line 322 of file NoiseReduction.cpp.

Referenced by Worker().

◆ mStatistics

Statistics& EffectNoiseReduction::Worker::mStatistics

Definition at line 323 of file NoiseReduction.cpp.

Referenced by Worker().


The documentation for this class was generated from the following file: