EECS151 / riscv-cpu / scripts / waveform.py
waveform.py
Raw
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# This function generates the waveform for sine, square and sawtooth
# 440Hz wave sampled at 44.1KHz
def waveform(wave_type):
	
	x = np.linspace(-np.pi, np.pi, 101)

	# sine
	if (wave_type == 1):
		out_wave = np.sin(x)

	# square
	elif (wave_type == 2):
		out_wave = signal.square(x)

	#sawtooth
	elif (wave_type == 3):
		out_wave = signal.sawtooth(x)

	else:
		out_wave = 0 * x

	return out_wave


# This function converts a number to fixed point representation of a certain 
# resolution. The numbers are limited to between -1 and 1, so there is no 
# integer but only fractions.
def frac_to_binary(number, res):
	
	bin_rep = "0"
	if (number < 0):
		bin_rep = "1"

	number = abs(number)

	for i in range(res-1):
		if (number >= 1/(2**(i+1))):
			number = number - 1/(2**(i+1))
			bin_rep = bin_rep + "1"
		else:
			bin_rep = bin_rep + "0"

	return  bin_rep


def write_to_file(res, wave_type):

	wave = waveform(wave_type)

	f = open('wave.txt','w')

	for sig in wave: 
		value = frac_to_binary(sig, res)
		f.write(value+"\n")

	f.close()

write_to_file(9, 3)