onde sinusoïdale qui augmente progressivement la fréquence de la f1 à f2 pour un temps donné
Je suis en train d'écrire un programme en c pour générer une onde sinusoïdale qui augmente progressivement la fréquence de la f1 à f2 pour un intervalle de temps.
J'ai écrit ce programme c de la rampe de fréquence de 0 à 10 Hz, mais le problème est que la fréquence des changements après l'achèvement de 360 degrés. Si j'essaie de changer la fréquence entre 0 et 360 degrés que la transition n'est pas lisse, et il est abrupte.
C'est l'équation du péché que j'ai utilisé y = Amplitude*sin(freq*phase)
int main(int argc, char *argv[]) {
double y, freq,phase;
int count; //for convenience of plotting in matlab so all the waves are spread on x axis.
for (freq = 0; freq < 10; freq+=1) {
for (phase = 0; phase < 360; phase++) { //phase is 360 degrees
y = 3 * sin((count*6.283185)+(freq*(phase*(3.14159/180))));
printf("%f %f %f \n", freq, phase, y);
}
count++;
}
return EXIT_SUCCESS;
}
- Comment puis-je changer la fréquence en douceur pour une période de temps donnée?
- devrais-je être à la recherche de Fourier transformations?
Pour générer un "vrai" péché d'onde de la fréquence de Hz utiliser des compteurs et minuteries. En utilisant le péché de la formule de la fréquence générée dépend de la vitesse à laquelle le programme s'exécute.
OriginalL'auteur katta | 2012-06-26
Vous devez vous connecter pour publier un commentaire.
si vous voulez fréquence angulaire (w=2 pi f) pour faire varier linéairement avec le temps alors
dw/dt = a
etw = w0 + (wn-w0)*t/tn
(oùt
va de 0 àtn
,w
va dew0
àwn
). la phase est l'intégrale, doncphase = w0 t + (wn-w0)*t^2/(2tn)
(comme dit oli):(où intervalle tn et delta t/tn).
voici la sortie de l'équivalent du code python (1-10Hz plus de 5 secondes):
ps d'ailleurs, si vous êtes à l'écoute de ce (ou de le regarder - tout ce qui implique la perception de l'homme) je soupçonne que vous ne voulez pas une augmentation linéaire, mais exponentielle. mais c'est une autre question...
+1 parce que je suis impressionné par vos compétences ^^
correction de l' (float) problème dans le code c, merci. ne comprends pas le commentaire à propos de phase, mais c'est seulement dans le cas où vous voulez toujours être dans la gamme de 0 à 2PI. je n'ai pas lu cela nulle part - j'ai travaillé - le, mais pour autant que je peux dire, c'est le même que l'entrée de wikipédia (que je oli liés et j'ai vérifié plus tard).
aussi, au lieu de soustraction répétée, vous pourriez faire plus de calcul direct. quelque chose comme
int n = phase / (2 * PI); phase -= n * 2 * PI
.cooke vous avez raison, je m'ennuie compris la boucle while. autre façon de mettre en œuvre la boucle while est une " phase = fmod(phase, (2 * PI));'
OriginalL'auteur andrew cooke
Lisse sinusoïde exige de la phase continue. La Phase est l'intégrale de la fréquence, donc si vous avez une fonction linéaire de la fréquence (c'est à dire une constante augmentation du taux de f1 à f2), puis phase est une fonction quadratique du temps.
Vous pouvez comprendre les maths avec un stylo et du papier, ou je peux vous dire que la forme d'onde résultante est appelée un chirp linéaire.
La transformée de Fourier d'un chirp linéaire est lui-même un chirp linéaire, donc probablement pas.
Merci pour de me pointer dans la bonne direction
OriginalL'auteur Oliver Charlesworth
Il devrait être assez simple. Plutôt que de réfléchir à la variation de la fréquence, penser à faire une rotation d'objet de plus en plus vite. La distance angulaire, il a voyagé pourrait être X après N secondes, mais sera plus que 2X (peut-être 4X) après 2N secondes. Alors, venez avec une formule pour la distance angulaire (par exemple, alpha = k1 * T + k2 * T**2), et le sinus de la distance angulaire pour trouver la valeur de la forme d'onde à tout moment T.
OriginalL'auteur Hot Licks