| 111 | } |
| 112 | |
| 113 | float MoodAnalyzer::calculateSpectralCentroid(const fft::Bins& fft) { |
| 114 | float weightedSum = 0.0f; |
| 115 | float magnitudeSum = 0.0f; |
| 116 | |
| 117 | for (size_t i = 0; i < fft.raw().size(); i++) { |
| 118 | float magnitude = fft.raw()[i]; |
| 119 | weightedSum += i * magnitude; |
| 120 | magnitudeSum += magnitude; |
| 121 | } |
| 122 | |
| 123 | return (magnitudeSum < 1e-6f) ? 0.0f : weightedSum / magnitudeSum; |
| 124 | } |
| 125 | |
| 126 | float MoodAnalyzer::calculateSpectralRolloff(const fft::Bins& fft, float threshold) { |
| 127 | float totalEnergy = 0.0f; |