Bonjour, j'aimerais avoir votre avis sur cette méthode de calcul, j'ai un peu de mal à rendre un signal périodique, voyez-vous une erreur ?
public static WaveCmp[] getComponents (double[] values, int samplerate, int harmonics)
{
WaveCmp[] result = new WaveCmp[harmonics];
double baseLevel = 0;
for (int i = 0; i < values.Length; i++)
baseLevel += values [i];
baseLevel /= values.Length;
for (int i = 0; i < harmonics; i++) {
double f = samplerate / (double)values.Length * (i + 1);
result [i] = new WaveCmp ();
for (int j = 0; j < values.Length; j++) {
double ph = f * (Math.PI * 2d / samplerate) * j;
result [i].a += values [j] * Math.Cos (ph);
result [i].b += values [j] * Math.Sin (ph);
}
result [i].a *= 2d / samplerate;
result [i].b *= 2d / samplerate;
result [i].frq = f;
result[i].amp = Math.Pow(result[i].a*result[i].a+result[i].b*result[i].b,1/2d);
result[i].ph = Math.Atan2 (result[i].b, result[i].a);
result [i].lvl = baseLevel;
}
return result;
}
public struct WaveCmp
{
public double a, b, frq, amp, ph, lvl;
}
Et voici la fonction restituant en principe le signal :
public static double Level (WaveCmp[] cmpts, int samplerate, int pos)
{
double v_ = cmpts [0].lvl;
for (int j = 0; j < cmpts.Length; j++) {
double ph = cmpts [j].frq * Math.PI * 2d / samplerate * pos;
v_ += cmpts [j].a * Math.Cos (ph);
v_ += cmpts [j].b * Math.Sin (ph);
}
return v_;
}
