here is my draft. to test it, i should give a full range and verify it's the same as the fft. def micro_ft(time_data, max_period): N = time_data.shape[-1] # for the highest frequencies, we can still probably do k * n / N # but rather than starting at k = 0, we'll want to start at the minimum, and have # fractional k's prior to that. # max_period is number of samples # k is calculable from it min_k = N / max_period k = np.linspace(min_k / N, 1, N) n = np.arange(N) # freq[k] = sum_over_n(time[n] * exp(-2 * pi * i * k * n / N)) return time_data * np.exp(-2j * np.pi * k * n) def micro_ift(freq_data, max_period): N = time_data.shape[-1] min_k = N / max_period k = np.linspace(min_k / N, 1, N) n = np.arange(N) # time[n] = sum_over_k(freq[k] * exp(2 * pi * i * k * n / N)) return freq_data * exp(2j * np.pi * k * n)