so what is that like; what am i actually doing, and why doesn't it work? i basically am producing fft output that is much larger than the input. i'm probably multiplying by too few indices, and effectively producing a rectangular matrix that is not symmetrical and doesn't produce the back-migration needed to invert successfully. 1704 if i were to form the entire square matrix, how would i then multiply it by the data? this is a matrix for a 5-long vector:
mat = np.exp(np.outer(np.array([0,1,2,3,4]), 2j * np.pi * np.fft.fftfreq(5))) np.angle(mat)*180 // np.pi array([[ 0., 0., 0., -0., -0.], [ 0., 72., 144., -144., -72.], [ 0., 144., -73., 72., -144.], [ 0., -145., 71., -72., 144.], [ 0., -73., -145., 144., 72.]])
interestingly, the angles actually change if i provide the frequencies in a different order, but they stay balanced with negative signs around diagonal lines
v * mat Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operands could not be broadcast together with shapes (3,) (5,5)
well, that's a minor issue. so, if i want to successfully reconstruct things here, i'll need each angular behavior to be countered by an opposing angular behavior. i'd like to include all the frequency data! blrgh 1710 - i have 5 frequencies i want to think about - there are only 3 inputs - usually, each input is multiplied by each frequency. that's okay. - the output is composed of what? each item summed, for each frequency, right? i played around a little and it actually works fine if a rectangular matrix is used but a different region of the matrix is selected for the input and the output and, notably, the denominator is the number of total frequencies, not the number of values.
v array([0.0335134 , 0.56891046, 0.869467 ]) ((v * mat[:,:3]).sum(axis=1) * mat[:3,:].conj()).real.sum(axis=1) / 5 array([0.0335134 , 0.56891046, 0.869467 ])
so, that denominator situation is probably the issue in my code. i can also check the frequency products.