aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/audio_processing/agc/agc_audio_proc.h
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/modules/audio_processing/agc/agc_audio_proc.h')
-rw-r--r--webrtc/modules/audio_processing/agc/agc_audio_proc.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/webrtc/modules/audio_processing/agc/agc_audio_proc.h b/webrtc/modules/audio_processing/agc/agc_audio_proc.h
new file mode 100644
index 0000000000..e5eb390170
--- /dev/null
+++ b/webrtc/modules/audio_processing/agc/agc_audio_proc.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AGC_AGC_AUDIO_PROC_H_
+#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_AGC_AUDIO_PROC_H_
+
+#include "webrtc/base/scoped_ptr.h"
+#include "webrtc/modules/audio_processing/agc/common.h"
+#include "webrtc/typedefs.h"
+
+namespace webrtc {
+
+class AudioFrame;
+class PoleZeroFilter;
+
+class AgcAudioProc {
+ public:
+ // Forward declare iSAC structs.
+ struct PitchAnalysisStruct;
+ struct PreFiltBankstr;
+
+ AgcAudioProc();
+ ~AgcAudioProc();
+
+ int ExtractFeatures(const int16_t* audio_frame,
+ int length,
+ AudioFeatures* audio_features);
+
+ static const int kDftSize = 512;
+
+ private:
+ void PitchAnalysis(double* pitch_gains, double* pitch_lags_hz, int length);
+ void SubframeCorrelation(double* corr, int length_corr, int subframe_index);
+ void GetLpcPolynomials(double* lpc, int length_lpc);
+ void FindFirstSpectralPeaks(double* f_peak, int length_f_peak);
+ void Rms(double* rms, int length_rms);
+ void ResetBuffer();
+
+ // To compute spectral peak we perform LPC analysis to get spectral envelope.
+ // For every 30 ms we compute 3 spectral peak there for 3 LPC analysis.
+ // LPC is computed over 15 ms of windowed audio. For every 10 ms sub-frame
+ // we need 5 ms of past signal to create the input of LPC analysis.
+ static const int kNumPastSignalSamples = kSampleRateHz / 200;
+
+ // TODO(turajs): maybe defining this at a higher level (maybe enum) so that
+ // all the code recognize it as "no-error."
+ static const int kNoError = 0;
+
+ static const int kNum10msSubframes = 3;
+ static const int kNumSubframeSamples = kSampleRateHz / 100;
+ static const int kNumSamplesToProcess = kNum10msSubframes *
+ kNumSubframeSamples; // Samples in 30 ms @ given sampling rate.
+ static const int kBufferLength = kNumPastSignalSamples + kNumSamplesToProcess;
+ static const int kIpLength = kDftSize >> 1;
+ static const int kWLength = kDftSize >> 1;
+
+ static const int kLpcOrder = 16;
+
+ int ip_[kIpLength];
+ float w_fft_[kWLength];
+
+ // A buffer of 5 ms (past audio) + 30 ms (one iSAC frame ).
+ float audio_buffer_[kBufferLength];
+ int num_buffer_samples_;
+
+ double log_old_gain_;
+ double old_lag_;
+
+ rtc::scoped_ptr<PitchAnalysisStruct> pitch_analysis_handle_;
+ rtc::scoped_ptr<PreFiltBankstr> pre_filter_handle_;
+ rtc::scoped_ptr<PoleZeroFilter> high_pass_filter_;
+};
+
+} // namespace webrtc
+
+#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_AGC_AUDIO_PROC_H_