Compare commits

..

No commits in common. "e36773a9ac6e718a06b84ed7e0f1e5836f47c2d5" and "1aca907e744a925cc285a6abcf31f78a436e0832" have entirely different histories.

View File

@ -7,43 +7,37 @@ 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 for cos wave # Initialize state variables
# 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 q1 = 1.0
# q1 previous sample in sinusoid q2 = 1.0
q1 = math.cos(omega * (n - 1)) # use math.sin(omega * (n-1)) for sin wave result = []
# 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[i] = sample * amplitude result.append(sample * amplitude)
return result return result
def sinusoid(n, cycles=1, phase=0): def sinusoid(n, cycles=1):
result = [] result = []
for i in range(phase, n+phase): for i in range(1, n+1):
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
def main(): def main():
samp_per_cycle = 512 cycles = 2
cycles = 3 signal = goertzel_sinusoid(cycles, 1, 1024, 1)
len = cycles * samp_per_cycle reference = np.array(sinusoid(1024, cycles))
signal = goertzel_sinusoid(1, cycles, samp_per_cycle, 1)
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, 1024))
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*100000000000) #plt.plot(x, error*1000/3)
plt.show() plt.show()
if __name__ == "__main__": if __name__ == "__main__":