2016-09-02 4 views
0

Je me bats juste avec la modulation de l'onde sinusale. J'ai une fréquence (à partir de données enregistrées - changeant dans le temps) et maintenant j'ai besoin de tracer une onde sinusoïdale avec une fréquence correspondante.a la fréquence, besoin d'ondes sinusales en python

real data and sinus

La ligne bleue sont juste des points de données tracés réels et le vert est ce que je l'ai fait jusqu'à présent, mais il n'a pas corespond avec des données réelles du tout.

Le code pour tracer onde sinusoïdale est inférieure:

def plotmodulsin(): 
    n = 530 
    f1, f2 = 16, 50 # frequency 

    t = linspace(6.94,8.2,530) 
    dt = t[1] - t[0] # needed for integration 
    print t[1] 
    print t[0] 
    f_inst = logspace(log10(f1), log10(f2), n) 
    phi = 2 * pi * cumsum(f_inst) * dt # integrate to get phase 
    pylab.plot(t, 5*sin(phi)) 

vecteur Amplitude:

[2,64, -2,64, 6,14, -6,14, 9,56, -9,56, 12,57, -12,57, 15,55, -15,55, 18,04, -18,04, 21,17, -21,17, 23,34, -23,34, 25,86, -25,86, 28,03, -28,03, 30,49, -30,49, 33,28, -33,28, 35,36, -35,36, 36,47, -36,47, 38,86, -38,86, 41,49, -41,49, 42,91, -42,91, 44,41, -44,41, 45,98, -45,98, 47,63, -47,63, 47,63, -47,63, 51,23, -51,23, 51,23, -51,23, 53,18, -53,18, 55,24, -55,24, 55,24, -55,24, 55,24, -55,24, 57,43, -57,43, 57,43, -57 .43, 59,75, -59,75, 59,75, -59,75, 59,75, -59,75, 59,75, -59,75, 62,22, -62,22, 59,75, -59,75, 62,22, -62,22, 59,75, -59,75, 62,22, -62,22, 62,22, -62,22, 59,75, -59,75, 62,22, -62,22, 62,22, -62,22, 59,75, -59,75, 62,22, -62,22, 62,22, -62,22, 62,22, -62,22, 59,75, -59,75, 62,22, -62,22, 59,75, -59,75, 62,22, -62,22, 59,75, -59,75, 59,75]

vecteur temps pour des données réelles:

[6,954, 6,985, 7,016, 7,041, 7,066, 7,088, 7,11, 7,13, 7.149, 7.167, 7.186, 7.202, 7.219, 7.235, 7.251, 7.266, 7.282, 7.296, 7.311, 7.325, 7.339, 7.352, 7.366, 7.379, 7.392, 7.404, 7.417, 7.43, 7.442, 7.454, 7.466, 7.478, 7.49, 7,501, 7,513, 7,524, 7,536, 7,547, 7,558, 7.569, 7.58, 7.591, 7.602, 7.613, 7.624, 7.634, 7.645, 7.655, 7.666, 7.676, 7.686, 7.697, 7.707, 7.717, 7.728, 7.738, 7.748, 7.758, 7.768, 7.778, 7.788, 7.798, 7.808, 7.818, 7,828, 7,838, 7,848, 7,858, 7,868, 7,877, 7,887, 7,897, 7,907, 7,917, 7,927, 7,937, 7,946, 7,956, 7,966, 7,976, 7,986, 7,996, 8,006, 8,016, 8,026, 8,035, 8,045, 8,055, 8,065, 8,075, 8,084, 8,094, 8,104, 8,114, 8,124, 8,134, 8,144, 8,154, 8,164, 8,174, 8,184, 8,194, 8,20]

donc j'ai besoin de générer des sinus avec une amplitude constante et la fréquence suivante:

[10,5, 16,03, 20,0, 22,94, 25,51, 27,47, 29,76, 31,25, 32,89, 34,25, 35,71, 37,31, 38,46, 39,06, 40,32, 41,67, 42,37, 4 3.1, 43,86, 44,64, 44,64, 46,3, 46,3, 47,17, 48,08, 48,08, 48,08, 49,02, 49,02, 50,0, 50,0, 50,0, 50,0]

+0

Vous tracer une sinusoïdale avec une amplitude constante (5). Ainsi, vous ne pouvez pas espérer qu'il corresponde à vos données qui ont une amplitude, qui semble augmenter plus ou moins linéairement jusqu'à atteindre 60. Mais sans la forme de vos données et aucune information sur ce qu'elles représentent, on ne peut pas vraiment décider comment s'adapter vos données. Le meilleur que l'on puisse faire est de tracer quelque chose qui semble qualitativement similaire ... – jotasi

+0

Ce dont j'ai besoin maintenant, c'est de faire correspondre les données avec leur fréquence. Amplitude puis-je faire comme prochaine étape? C'est pourquoi je me suis multiplié avec un nombre constant. –

+0

J'ai ajouté mes vecteurs si quelqu'un pouvait s'en occuper? –

Répondre

0

Vous pouvez essayer de vous correspondre fonction avec quelque chose ou sonore semi En fait, il s'agit d'un cosinus, en extrayant des estimations de la fréquence et de l'amplitude de vos données. Si je vous ai bien compris, vos données sont des maximums et des minimums et vous voulez avoir une fonction trigonométrique qui ressemble à cela. Si vos données sont enregistrées dans deux tableaux time et value, les estimations d'amplitude sont simplement données par np.abs(value). Les fréquences sont données comme l'inverse de deux fois la différence de temps entre un maximum et un minimum. freq = 0.5/(time[1:]-time[:-1]) vous donne des estimations de fréquence pour les points médians de chaque intervalle de temps. Les temps correspondants sont ainsi donnés sous la forme freqTimes = (time[1:]+time[:-1])/2..

Pour obtenir une courbe plus lisse, vous pouvez maintenant interpoler ces valeurs d'amplitude et de fréquence afin d'obtenir des estimations pour les valeurs intermédiaires. Un moyen très simple de le faire est d'utiliser np.interp, qui fera une interpolation linéaire simple. Vous devrez spécifier à quels moments dans le temps d'interpoler. Nous allons construire un tableau pour cela et puis interpoler par:

n = 10000 
timesToInterpolate = np.linspace(time[0], time[-1], n, endpoint=True) 
freqInterpolated = np.interp(timesToInterpolate, freqTimes, freq) 
amplInterpolated = np.interp(timesToInterpolate, time, np.abs(value)) 

Maintenant, vous pouvez faire l'intégration, que vous aviez déjà dans votre exemple en faisant:

phi = (2*np.pi*np.cumsum(freqInterpolated) 
     *(timesToInterpolate[1]-timesToInterpolate[0])) 

Et vous pouvez maintenant tracer. Donc, mettre tous ensemble vous donne:

import numpy as np 
import matplotlib.pyplot as plt 

time = np.array([6.954, 6.985, 7.016, 7.041, 7.066, 7.088, 7.11, 7.13]) #... 
value = np.array([2.64, -2.64, 6.14, -6.14, 9.56, -9.56, 12.57, -12.57]) #... 

freq = 0.5/(time[1:]-time[:-1]) 
freqTimes = (time[1:]+time[:-1])/2. 

n = 10000 
timesToInterpolate = np.linspace(time[0], time[-1], n, endpoint=True) 
freqInterpolated = np.interp(timesToInterpolate, freqTimes, freq) 
amplInterpolated = np.interp(timesToInterpolate, time, np.abs(value)) 

phi = (2*np.pi*np.cumsum(freqInterpolated) 
     *(timesToInterpolate[1]-timesToInterpolate[0])) 

plt.plot(time, value) 
plt.plot(timesToInterpolate, amplInterpolated*np.cos(phi)) #or np.sin(phi+np.pi/2) 
plt.show() 

Le résultat ressemble à ceci (si vous incluez les tableaux complets):

enter image description here

+0

wow ... merci ... c'est merveilleux: D –