2014-07-03 4 views
1

J'ai commencé à utiliser le son pour la synthèse audio, je ne sais pas pourquoi j'obtiens ces bruits de clics bruyants dans les sons?Comment générer une onde sinusoïdale dans AS3 sans clics?

Mes boucles est:

for(i in 0...2048) 
{ 
var phase:Float = position/44100.0 * Math.PI * 2; 
position+=1; 
sample = Math.sin(phase * v); // where v varies between 200 to 400 
event.data.writeFloat(sample); // left 
event.data.writeFloat(sample); // right 
} 

Toute idée?

EDIT

Ce que je dois faire est de fréquence interpoler dans la boucle:

var phaserad:Float= 2*Math.PI/44100; 
var delta:Float = current_v - new_v; 
var p:Int= 2048; 
for(i in 0...2048) 
{ 
p--; 
v = new_v + delta * (p/2048); // v will interpolate from current_v to new_v 
position += v * phaserad; 
sample = Math.sin(position);  
event.data.writeFloat(sample); // left 
event.data.writeFloat(sample); // right 
} 

current_v = new_v; 

mais, je ne pouvais rien entendre, j'ai essayé une autre approche:

var delta:Float = current_v - new_v; 
var p:Int= 2048; 

for(i in 0...2048) 
{ 
var phase:Float = position/44100.0 * Math.PI * 2; 
position+=1; 

p--; 
v = new_v + delta * (p/2048); // v will interpolate from current_v to new_v 

sample = Math.sin(phase * v); // where v varies between 200 to 400 
event.data.writeFloat(sample); // left 
event.data.writeFloat(sample); // right 
} 

mais, la fréquence va continuer à augmenter, et il ne s'arrêtera pas à new_v

+0

Changez-vous soit 'position' ou' v' entre l'appel de ces boucles? En outre, si vous augmentez la portée à 8192, cela diminuera-t-il le nombre de clics? – Vesper

+0

J'ai besoin d'avoir la portée au minimum pour que mon application reste réactive – simo

+0

Veuillez voir EDIT au dessus de – simo

Répondre

0

Vous avez votre générateur d'ondes se mettre à droite, mais l'approche avec position sauvé nécessite votre v à être constant et position inchangé. Compte tenu de votre description de v, vous le modifiez en cours de lecture d'une façon ou d'une autre, mais en changeant v les résultats sont sous forme sinusoïdale pour être perturbés. Ainsi, au lieu de recalculer position à partir de zéro, vous devez accumuler la phase et ajouter le décalage actuel basé sur v pour recevoir une forme d'onde ininterrompue.

const phaserad:Number=2*Math.PI/44100; 
for(var i:int=0;i<2048;i++) 
{ 
    position+=v*phaserad; // requires this var to be "Number" type 
    sample = Math.sin(position); // where v varies between 200 to 400 
    event.data.writeFloat(sample); // left 
    event.data.writeFloat(sample); // right 
} 
+0

S'il vous plaît voir EDIT ci-dessus – simo

+0

Un son 2048 échantillons de longueur est 0,05 seconde. Vous devez calculer la longueur désirée de votre son avant les boucles en cours, puis divisez votre affectation 'v' par la longueur calculée au lieu de 2048. La longueur dans les échantillons est' (length_in_seconds) * 44100'. – Vesper

+0

J'écris un simulateur, la fréquence change environ 40 par seconde, je vais essayer de le faire, merci – simo

0

Si vous voulez une condition sine onde continue à vos besoins de phase à 0 -> 360 -> 0 -> 360 degrés etc.

+0

mais pourquoi ai-je des sons de clic? – simo

+0

Parce que si la phase n'est pas lisse, la forme d'onde sautera. Écrivez vos données d'échantillon dans un fichier wave et ouvrez-le dans un éditeur comme audacity ... il devrait être immédiatement évident où les discontinuités sont. –

+0

s'il vous plaît voir EDIT ci-dessus – simo

Questions connexes