A ke zpracování signálů na jednom řádku - mezi zpracování signálů se dá započítat třeba FIR filtr 1. řádu u ADC na potlačení šumu.
Třeba derivační článek xn+1 = 7/8*xn + 1/8*a se napíše v C v přerušení 12b ADC takto:
volatile uint16_t x = 0;
void ADC_ISR(void) {
x = ((x << 3) - x + ADC_VALUE) >> 3;
}
Třeba u ARMu s barrel shifterem je to velice efektivní metoda. Jenom vědět, jak na to bez násobení a floatů.
Python nedělám, ale pokud by chtěl stejně filtrovat data, tak princip bude pořád stejný. A taky se to asi vejde na jednu lajnu...
v Pythonu na běžném procesoru je IMHO
x = (x*7 + ADC_VALUE)//8
stejně rychlé a je to přesnější přepis toho vzorce. Snáz se to čte.
Ještě bych dodal, že nemá smysl snažit se takovéhle věci implementovat efektivně v pythonu. To nejde. Existuje spousta hotových filtrů implementovaných v C:
http://docs.scipy.org/doc/scipy/reference/signal.htmlO zpracování signálů nic nevím, ale předpokládám, že tam najdete co potřebujete.
Případně existují způsoby jak snadno kombinovat C a python:
import numpy as np
import scipy as sp
from scipy.weave import inline
def my_fir(arr):
assert isinstance(arr, np.ndarray)
n = len(arr)
code = """
int x = 0;
for(int i = 0; i < n; i++)
{
x = ((x << 3) - x + arr[i]) >> 3;
arr[i] = x;
}
"""
inline(code, ['arr', 'n'], compiler='gcc')
return arr
arr = np.array(range(20))
newarr = my_fir(arr)
print newarr
Případně existují řešení kompilující podmnožinu pythonu:
http://numba.pydata.org/Asi úplně nejlepší je přejít na Julii. Dohadovat se, jestli je v Pythonu rychlejší bitový posun nebo dělení a násobení je nesmysl. Mnohom většího zrychlení dosáhnete přechodem na jiný jazyk.