From f7d4370164b28ec5e0fdb8a4681b1b3234f22dc6 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Wed, 15 Dec 2021 22:52:58 +0100 Subject: Clean up code listings --- doc/thesis/chapters/implementation.tex | 79 ++++++++++++++++------------------ 1 file changed, 37 insertions(+), 42 deletions(-) (limited to 'doc') diff --git a/doc/thesis/chapters/implementation.tex b/doc/thesis/chapters/implementation.tex index 191feba..d35e926 100644 --- a/doc/thesis/chapters/implementation.tex +++ b/doc/thesis/chapters/implementation.tex @@ -281,41 +281,41 @@ Thus, they will be distributed among the other whole numbers. A window function \begin{lstlisting}[ texcl = true, language = python, escapechar = {`}, - float, captionpos = b, label = {lst:fir-block}, + float, captionpos = b, label = {lst:fractional-delay-fir}, caption = { - Block FIR Filter function referenced in listing \ref{lst:phasecorr-work}. + Implementation of a static fractional delay FIR filter. }, ] def work(self, input_items, output_items): inp = input_items[0] oup = output_items[0] - # reads the moduled signal - if len(self.amplitudes) != len(self.delays): - raise Exception("Amplitudes and Delay length dont match") - if np.min(self.delays)<0: - raise Exception("Delay can't be negativ") - # Some test that there are as match delays as amplitudes and no negative filter values - max_order = 2 * np.floor(np.max(self.delays)) + 1 - # find the maximal order of the Filter - max_samples = np.arange(0, max_order +1) - max_len = len(max_samples) - sum_x = np.zeros(int(max_len)) - - for (a,d) in zip(self.amplitudes,self.delays): + # find the length of the highest order filter + max_order = 2 * np.floor(np.max(self.delays)) + 1 + max_samples = np.arange(0, max_order +1) + max_len = len(max_samples) + # total impulse response (of all taps) + tot_h = np.zeros(int(max_len)) + # compute for each tap + for (a, d) in zip(self.amplitudes, self.delays): + # compute fir coefficients order = 2 * np.floor(d) + 1 - samples = np.arange(0, order +1) - h = a*(np.sinc(samples-d)) - # impuls respond - h_len = np.concatenate([h, np.zeros(max_len-len(h))]) - sum_x += h_len - # add them al together to have one array with al amplitudes one the position of the delay (in samples) - sum_x[0] = self.los - # if there is no direct line ad the first delayed amplitude to a zero else to a one. - y = np.convolve(inp, sum_x) - y += np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))]) + samples = np.arange(0, order + 1) + # compute impulse response + h = a * np.sinc(samples - d) + # correct length + h = np.concatenate([h, np.zeros(max_len - len(h))]) + # add to other filters + tot_h += h + # add a LOS path if necessary + tot_h[0] = self.los + # compute output + y = np.convolve(inp, tot_h) + # add values from previous block processing + y += np.concatenate([self.temp, np.zeros(len(y) - len(self.temp))]) + # write to output oup[:] = y[:len(inp)] - self.temp = y[len(inp):] - # The output need to have the same lenght as the input. + # save rest for next block processing + self.temp = y[len(inp):] return len(oup) \end{lstlisting} @@ -367,33 +367,28 @@ For generating the Byte error rate it is focus on byte-blocks of a specific leng } - \begin{lstlisting}[ texcl = true, language = python, escapechar = {`}, - float, captionpos = b, label = {lst:ber-block}, + float, captionpos = b, label = {lst:ber-work}, caption = { - Block FIR Filter function referenced in listing \ref{lst:phasecorr-work}. + Custom block to compute the empirical BER. }, ] def work(self, input_items, output_items): + # input is a list of blocks of k-bytes inp = input_items[0] - # input vector - + # for each block for i in inp: i = np.array(i, dtype=np.uint8) + # XOR to compute the difference v = np.array(self.vgl, dtype=np.uint8) ^ i - # XOR comparsion to find the diviation for the bits + # compute how many bits differ ber = sum(np.unpackbits(v)) - - trueber = ber - 32 - if trueber < 0: - trueber = 0 - - self.ber_samples.appendleft(trueber) - + # save BER value + self.ber_samples.appendleft(ber) + # compute statistics and send to GUI ber_max, ber_min, ber_avg = self.ber_stats() - self.send(self.encode([trueber, ber_max, ber_avg])) - #Send the valuse to the GUI + self.send(self.encode([ber_max, ber_min, ber_avg])) return len(inp) \end{lstlisting} -- cgit v1.2.1