more accurate state initialization
This commit is contained in:
parent
d1df8fdf97
commit
e36773a9ac
@ -7,22 +7,25 @@ def goertzel_sinusoid(freq, duration, sample_rate, amplitude):
|
|||||||
omega = (2.0 * math.pi * freq) / sample_rate
|
omega = (2.0 * math.pi * freq) / sample_rate
|
||||||
coeff = 2.0 * math.cos(omega)
|
coeff = 2.0 * math.cos(omega)
|
||||||
|
|
||||||
# Initialize state variables
|
# Initialize state variables for cos wave
|
||||||
q1 = 1.0 # previous sample in sinusoid (1.0 for sample 1)
|
# You can use 1.0 for q1 and q2 for a cos wave with slightly larger amplitude and a phase shift of 1/2 a sample
|
||||||
q2 = 1.0 # previous previous sample (approximately 1.0 for sample 1)
|
# q1 previous sample in sinusoid
|
||||||
result = []
|
q1 = math.cos(omega * (n - 1)) # use math.sin(omega * (n-1)) for sin wave
|
||||||
|
# q2 previous previous sample
|
||||||
|
q2 = math.cos(omega * (n - 2)) # use math.sin(omega * (n-2)) for sin wave
|
||||||
|
result = np.zeros(n)
|
||||||
|
|
||||||
for i in range(n):
|
for i in range(n):
|
||||||
sample = coeff * q1 - q2
|
sample = coeff * q1 - q2
|
||||||
q2 = q1
|
q2 = q1
|
||||||
q1 = sample
|
q1 = sample
|
||||||
result.append(sample * amplitude)
|
result[i] = sample * amplitude
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def sinusoid(n, cycles=1):
|
def sinusoid(n, cycles=1, phase=0):
|
||||||
result = []
|
result = []
|
||||||
for i in range(1, n+1):
|
for i in range(phase, n+phase):
|
||||||
sample = math.cos(2.0 * cycles * math.pi * (i/n))
|
sample = math.cos(2.0 * cycles * math.pi * (i/n))
|
||||||
result.append(sample)
|
result.append(sample)
|
||||||
return result
|
return result
|
||||||
@ -34,12 +37,13 @@ def main():
|
|||||||
signal = goertzel_sinusoid(1, cycles, samp_per_cycle, 1)
|
signal = goertzel_sinusoid(1, cycles, samp_per_cycle, 1)
|
||||||
reference = np.array(sinusoid(len, cycles))
|
reference = np.array(sinusoid(len, cycles))
|
||||||
error = reference - signal
|
error = reference - signal
|
||||||
|
print("max amplitude:", signal.max())
|
||||||
print("max error:", error.max())
|
print("max error:", error.max())
|
||||||
x = np.array(range(0, len))
|
x = np.array(range(0, len))
|
||||||
plt.plot(x, signal)
|
plt.plot(x, signal)
|
||||||
plt.plot(x, reference)
|
plt.plot(x, reference)
|
||||||
plt.plot(x, error)
|
plt.plot(x, error)
|
||||||
#plt.plot(x, error*100)
|
#plt.plot(x, error*100000000000)
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user