2016-09-02 3 views
0

저는 부비동 파의 변조로 싸우고 있습니다. 주파수 (메신저 데이터에서 - 시간이 변함)가 있고 이제는 해당 주파수로 부비동 파를 그려야합니다.주파수를 얻었습니다, 파이썬에서 플롯 부비동 파가 필요합니다.

real data and sinus

파란색 라인은 실제 데이터의 포인트를 그려 및 녹색 내가 지금까지 한 일이지만, 전혀 실제 데이터 corespond하지 않습니다. 사인파 음모

코드 바닥이다

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)) 

진폭 벡터 :

[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, 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 0.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.20, -62.22, 59.75, -59.75, 62.22, -62.22, 59.75, -62.22, 59.75, -62.22, 59.75, -59.75, 62.22, 59.20, -59.75, 62.22, -62.22, 59.75, -59.75, 59.75]

시차 벡터에 대한 실제 데이터 :

[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.613, 7.624, 7.666, 7.676, 7.686, 7.697, 7.707, 7.717, 7.728, 7.738, 7.748, 7.758, 7.828, 7.838, 7.848, 7.838, 7.848, 7.858, 7.868, 7.877, 7.887, 7.997, 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]

그래서 일정한 진폭과 다음 주파수 동을 생성해야

[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

당신은 일정한 진폭과 사인을 플롯 (5). 따라서 진폭을 가진 데이터가 60에 도달 할 때까지 선형 적으로 증가하는 것처럼 보이지는 않을 것입니다. 그러나 데이터의 형태와 데이터가 나타내는 것에 대한 정보가 없으면 실제로 어떻게 적합할지 결정할 수 없습니다 귀하의 데이터. 최고의 사람은 질적으로 비슷한 모습을 그릴 수 있습니다 ... – jotasi

+0

내가 지금 필요한 것은 그 빈도와 데이터 olny를 일치시키는 것입니다. 진폭은 다음 단계로 할 수 있습니다. 그게 내가 정수로 곱한 이유. –

+0

누군가가 그 문제를 해결할 수 있다면 내 벡터를 추가 했습니까? –

답변

0

당신이 뭔가 기능과 일치하도록 시도 할 수 sine- 또는 데이터에서 주파수와 진폭에 대한 추정치를 추출하여 실제로 코사인과 유사합니다. 내가 너를 올바르게 이해했다면, 데이터는 최대치와 최소치이며 삼각 함수를 원한다. 데이터가 두 개의 배열 timevalue에 저장된 경우 진폭 추정치는 np.abs(value)에 의해 간단히 주어집니다. 주파수는 최대와 최소 사이의 시간차의 2 배의 역수로 주어집니다. freq = 0.5/(time[1:]-time[:-1])은 각 시간 간격의 중간 지점에 대한 빈도 추정치를 제공합니다. 따라서 대응 시간은 freqTimes = (time[1:]+time[:-1])/2.으로 주어진다.

더 부드러운 곡선을 얻으려면 이제 진폭 및 주파수 값을 보간하여 그 사이의 값에 대한 추정치를 얻을 수 있습니다. 이렇게하는 간단한 방법은 간단한 선형 보간법을 수행하는 np.interp을 사용하는 것입니다. 보간 할 시점을 지정해야합니다. 우리는 그것을 위해 배열을 구성하고 다음으로 보간됩니다

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])) 

을 그리고 지금 당신은 플롯 할 수 있습니다. 그래서 모두 함께 넣어 당신에게 제공 : (당신이 전체 어레이를 포함하는 경우)

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() 

결과는 다음과 같습니다

enter image description here

+0

와우 ... 고마워 ... 훌륭해. D –

관련 문제