diff --git a/source/use_case/noise_reduction/include/RNNoiseProcess.hpp b/source/use_case/noise_reduction/include/RNNoiseProcess.hpp
index 3800019..0e19c68 100644
--- a/source/use_case/noise_reduction/include/RNNoiseProcess.hpp
+++ b/source/use_case/noise_reduction/include/RNNoiseProcess.hpp
@@ -192,7 +192,7 @@
          * @brief       Computes pitch cross-correlation.
          * @param[in]   x          Input vector 1.
          * @param[in]   y          Input vector 2.
-         * @param[out]  ac         Cross-correlation output vector.
+         * @param[out]  xCorr         Cross-correlation output vector.
          * @param[in]   len        Number of elements to consider for correlation.
          *                         computation.
          * @param[in]   maxPitch   Maximum pitch.
@@ -200,7 +200,7 @@
         void PitchXCorr(
             const vec1D32F& x,
             const vec1D32F& y,
-            vec1D32F& ac,
+            vec1D32F& xCorr,
             size_t len,
             size_t maxPitch);
 
diff --git a/source/use_case/noise_reduction/src/RNNoiseProcess.cc b/source/use_case/noise_reduction/src/RNNoiseProcess.cc
index d9a7b35..54b99f8 100644
--- a/source/use_case/noise_reduction/src/RNNoiseProcess.cc
+++ b/source/use_case/noise_reduction/src/RNNoiseProcess.cc
@@ -68,20 +68,20 @@
 
 void RNNoiseProcess::PostProcessFrame(vec1D32F& modelOutput, FrameFeatures& features, vec1D32F& outFrame)
 {
-    std::vector<float> g = modelOutput;  /* Gain values. */
-    std::vector<float> gf(FREQ_SIZE, 0);
+    std::vector<float> outputBands = modelOutput;
+    std::vector<float> gain(FREQ_SIZE, 0);
 
     if (!features.m_silence) {
-        PitchFilter(features, g);
+        PitchFilter(features, outputBands);
         for (size_t i = 0; i < NB_BANDS; i++) {
             float alpha = .6f;
-            g[i] = std::max(g[i], alpha * m_lastGVec[i]);
-            m_lastGVec[i] = g[i];
+            outputBands[i] = std::max(outputBands[i], alpha * m_lastGVec[i]);
+            m_lastGVec[i] = outputBands[i];
         }
-        InterpBandGain(gf, g);
+        InterpBandGain(gain, outputBands);
         for (size_t i = 0; i < FREQ_SIZE; i++) {
-            features.m_fftX[2 * i] *= gf[i];  /* Real. */
-            features.m_fftX[2 * i + 1] *= gf[i];  /*imaginary. */
+            features.m_fftX[2 * i] *= gain[i];  /* Real. */
+            features.m_fftX[2 * i + 1] *= gain[i];  /*imaginary. */
 
         }
 
@@ -132,7 +132,7 @@
                         features.m_Ex,
                         this->m_analysisMem);
 
-    float E = 0.0;
+    float energy = 0.0;
 
     vec1D32F Ly(NB_BANDS, 0);
     vec1D32F p(WINDOW_SIZE, 0);
@@ -197,12 +197,12 @@
         Ly[i] = std::max<float>(logMax - 7, std::max<float>(follow - 1.5, Ly[i]));
         logMax = std::max<float>(logMax, Ly[i]);
         follow = std::max<float>(follow - 1.5, Ly[i]);
-        E += features.m_Ex[i];
+        energy += features.m_Ex[i];
     }
 
     /* If there's no audio avoid messing up the state. */
     features.m_silence = true;
-    if (E < 0.04) {
+    if (energy < 0.04) {
         return;
     } else {
         features.m_silence = false;
@@ -215,7 +215,8 @@
     VERIFY(CEPS_MEM > 2);
     uint32_t stIdx1 = this->m_memId < 1 ? CEPS_MEM + this->m_memId - 1 : this->m_memId - 1;
     uint32_t stIdx2 = this->m_memId < 2 ? CEPS_MEM + this->m_memId - 2 : this->m_memId - 2;
-
+    VERIFY(stIdx1 < this->m_cepstralMem.size());
+    VERIFY(stIdx2 < this->m_cepstralMem.size());
     auto ceps1 = this->m_cepstralMem[stIdx1];
     auto ceps2 = this->m_cepstralMem[stIdx2];
 
@@ -547,7 +548,7 @@
     }
 
     size_t pitchIdx  = pitchIdx0_;
-    size_t pitchIdx0 = pitchIdx0_;
+    const size_t pitchIdx0 = pitchIdx0_;
 
     float xx = 0;
     for ( size_t i = xStart; i < xStart+frameSize; ++i) {
@@ -563,7 +564,7 @@
     yyLookup[0] = xx;
     float yy = xx;
 
-    for ( size_t i = 1; i < maxPeriod+1; ++i) {
+    for ( size_t i = 1; i < yyLookup.size(); ++i) {
         yy = yy + (pitchBuf[xStart-i] * pitchBuf[xStart-i]) -
                 (pitchBuf[xStart+frameSize-i] * pitchBuf[xStart+frameSize-i]);
         yyLookup[i] = std::max(0.0f, yy);
@@ -605,6 +606,7 @@
             xy2 += (pitchBuf[i] * pitchBuf[i-pitchIdx1b]);
         }
         xy = 0.5f * (xy + xy2);
+        VERIFY(pitchIdx1b < maxPeriod+1);
         yy = 0.5f * (yyLookup[pitchIdx1] + yyLookup[pitchIdx1b]);
 
         float g1 = this->ComputePitchGain(xy, xx, yy);
@@ -710,7 +712,7 @@
 void RNNoiseProcess::PitchXCorr(
     const vec1D32F& x,
     const vec1D32F& y,
-    vec1D32F& ac,
+    vec1D32F& xCorr,
     size_t len,
     size_t maxPitch)
 {
@@ -719,17 +721,17 @@
         for (size_t j = 0; j < len; j++) {
             sum += x[j] * y[i + j];
         }
-        ac[i] = sum;
+        xCorr[i] = sum;
     }
 }
 
 /* Linear predictor coefficients */
 void RNNoiseProcess::LPC(
-    const vec1D32F& ac,
+    const vec1D32F& correlation,
     int32_t p,
     vec1D32F& lpc)
 {
-    auto error = ac[0];
+    auto error = correlation[0];
 
     if (error != 0) {
         for (int i = 0; i < p; i++) {
@@ -737,10 +739,10 @@
             /* Sum up this iteration's reflection coefficient */
             float rr = 0;
             for (int j = 0; j < i; j++) {
-                rr += lpc[j] * ac[i - j];
+                rr += lpc[j] * correlation[i - j];
             }
 
-            rr += ac[i + 1];
+            rr += correlation[i + 1];
             auto r = -rr / error;
 
             /* Update LP coefficients and total error */
@@ -755,7 +757,7 @@
             error = error - (r * r * error);
 
             /* Bail out once we get 30dB gain */
-            if (error < (0.001 * ac[0])) {
+            if (error < (0.001 * correlation[0])) {
                 break;
             }
         }
@@ -790,19 +792,19 @@
     }
 }
 
-void RNNoiseProcess::PitchFilter(FrameFeatures &features, vec1D32F &g) {
+void RNNoiseProcess::PitchFilter(FrameFeatures &features, vec1D32F &gain) {
     std::vector<float> r(NB_BANDS, 0);
     std::vector<float> rf(FREQ_SIZE, 0);
     std::vector<float> newE(NB_BANDS);
 
     for (size_t i = 0; i < NB_BANDS; i++) {
-        if (features.m_Exp[i] > g[i]) {
+        if (features.m_Exp[i] > gain[i]) {
             r[i] = 1;
         } else {
 
 
-            r[i] = std::pow(features.m_Exp[i], 2) * (1 - std::pow(g[i], 2)) /
-                   (.001 + std::pow(g[i], 2) * (1 - std::pow(features.m_Exp[i], 2)));
+            r[i] = std::pow(features.m_Exp[i], 2) * (1 - std::pow(gain[i], 2)) /
+                   (.001 + std::pow(gain[i], 2) * (1 - std::pow(features.m_Exp[i], 2)));
         }
 
 
diff --git a/source/use_case/noise_reduction/src/UseCaseHandler.cc b/source/use_case/noise_reduction/src/UseCaseHandler.cc
index 12579df..2f53ce6 100644
--- a/source/use_case/noise_reduction/src/UseCaseHandler.cc
+++ b/source/use_case/noise_reduction/src/UseCaseHandler.cc
@@ -291,7 +291,7 @@
 
         size_t numByteToBeWritten = audioFrame.size() * sizeof(int16_t);
         if( numByteToBeWritten > memSize) {
-            printf_err("Overflow error: Writing %d of %d bytes to memory @ 0x%p.\n", memSize, numByteToBeWritten, memAddress);
+            printf_err("Overflow error: Writing %zu of %zu bytes to memory @ 0x%p.\n", memSize, numByteToBeWritten, memAddress);
             numByteToBeWritten = memSize;
         }
 
