dspx 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -71,8 +71,9 @@ namespace dsp
71
71
  for (size_t i = 1; i < m_b_coeffs.size(); ++i)
72
72
  {
73
73
  // x_state stores x[n-1], x[n-2], ..., x[n-M]
74
- // Read backwards: x[n-i] is at position (m_x_index - (i-1)) & m_x_mask
75
- size_t idx = (m_x_index - (i - 1)) & m_x_mask;
74
+ // Read backwards: x[n-i] is at position (m_x_index + m_x_mask + 1 - (i-1)) & m_x_mask
75
+ // Adding buffer size before subtraction prevents underflow
76
+ size_t idx = (m_x_index + m_x_mask + 1 - (i - 1)) & m_x_mask;
76
77
  output += m_b_coeffs[i] * m_x_state[idx];
77
78
  }
78
79
 
@@ -80,8 +81,9 @@ namespace dsp
80
81
  for (size_t i = 0; i < m_a_coeffs.size(); ++i)
81
82
  {
82
83
  // y_state stores y[n-1], y[n-2], ..., y[n-N]
83
- // Read backwards: y[n-(i+1)] is at position (m_y_index - i) & m_y_mask
84
- size_t idx = (m_y_index - i) & m_y_mask;
84
+ // Read backwards: y[n-(i+1)] is at position (m_y_index + m_y_mask + 1 - i) & m_y_mask
85
+ // Adding buffer size before subtraction prevents underflow
86
+ size_t idx = (m_y_index + m_y_mask + 1 - i) & m_y_mask;
85
87
  output -= m_a_coeffs[i] * m_y_state[idx];
86
88
  }
87
89
 
@@ -131,14 +133,14 @@ namespace dsp
131
133
  T y = m_b_coeffs[0] * input[n];
132
134
  for (size_t i = 1; i < m_b_coeffs.size(); ++i)
133
135
  {
134
- size_t idx = (x_idx - (i - 1)) & x_mask;
136
+ size_t idx = (x_idx + x_mask + 1 - (i - 1)) & x_mask;
135
137
  y += m_b_coeffs[i] * x_temp[idx];
136
138
  }
137
139
 
138
140
  // Feedback
139
141
  for (size_t i = 0; i < m_a_coeffs.size(); ++i)
140
142
  {
141
- size_t idx = (y_idx - i) & y_mask;
143
+ size_t idx = (y_idx + y_mask + 1 - i) & y_mask;
142
144
  y -= m_a_coeffs[i] * y_temp[idx];
143
145
  }
144
146
 
@@ -162,14 +164,14 @@ namespace dsp
162
164
  T y = m_b_coeffs[0] * input[n];
163
165
  for (size_t i = 1; i < m_b_coeffs.size(); ++i)
164
166
  {
165
- size_t idx = (m_x_index - (i - 1)) & m_x_mask;
167
+ size_t idx = (m_x_index + m_x_mask + 1 - (i - 1)) & m_x_mask;
166
168
  y += m_b_coeffs[i] * m_x_state[idx];
167
169
  }
168
170
 
169
171
  // Feedback
170
172
  for (size_t i = 0; i < m_a_coeffs.size(); ++i)
171
173
  {
172
- size_t idx = (m_y_index - i) & m_y_mask;
174
+ size_t idx = (m_y_index + m_y_mask + 1 - i) & m_y_mask;
173
175
  y -= m_a_coeffs[i] * m_y_state[idx];
174
176
  }
175
177