Audit finding
- ID:
AUD-027
- Status: Verified defect
- Severity: Medium
- Confidence: High
- Audited revision:
2f479320d805a1f9f35ebe4afaaeeded48913a94
Problem
When the evaluated transfer denominator is exactly zero, FrequencyResponse::Calculate() replaces it with 1+0i. An exact pole is therefore reported as the numerator magnitude instead of infinity, a documented saturation, or failure. The current test encodes this false finite result.
Source:
|
std::complex<T> numerator(static_cast<T>(0), static_cast<T>(0)); |
|
std::complex<T> denominator(static_cast<T>(0), static_cast<T>(0)); |
|
|
|
for (std::size_t i = 0; i < b.size(); ++i) |
|
numerator += b[i] * std::polar(static_cast<T>(1), -omega * static_cast<T>(i)); |
|
|
|
for (std::size_t i = 0; i < a.size(); ++i) |
|
denominator += a[i] * std::polar(static_cast<T>(1), -omega * static_cast<T>(i)); |
|
|
|
if (denominator == static_cast<T>(0)) |
|
denominator.real(static_cast<T>(1)); |
|
|
|
auto h = numerator / denominator; |
|
auto magnitude = std::max(std::abs(h), std::numeric_limits<T>::min()); |
|
|
|
frequencies.emplace_back(f); |
|
response.emplace_back(static_cast<T>(20) * math::Log10(magnitude)); |
|
phase.emplace_back(std::arg(h) * static_cast<T>(180) / static_cast<T>(std::numbers::pi)); |
Acceptance criteria
Audit finding
AUD-0272f479320d805a1f9f35ebe4afaaeeded48913a94Problem
When the evaluated transfer denominator is exactly zero,
FrequencyResponse::Calculate()replaces it with1+0i. An exact pole is therefore reported as the numerator magnitude instead of infinity, a documented saturation, or failure. The current test encodes this false finite result.Source:
numerical-toolbox-cpp/numerical/control_analysis/FrequencyResponse.hpp
Lines 63 to 80 in 2f47932
Acceptance criteria