[ot][spam][random][crazy][random][crazy]

Undescribed Horrific Abuse, One Victim & Survivor of Many gmkarl at gmail.com
Sun Nov 13 05:55:35 PST 2022


the comparison is failing, [although the sample_idcs look right now,]
so given fourier.py passes its internal tests, the difference must lie
in how waveform is being sampled compared to the assumptions that
fourier.py is making
0843

i can go into both functions and again examine the first few data items

  7     def sample_sinusoids_funny(data, fractional_indices, max_period):
  8  ->     return np.array([
  9             ((np.exp(2j * sample_idx * np.pi *
np.fft.fftfreq(len(data)))) * np.fft.fft(data)).sum() / len(data) for
sample_idx in fractional_indices
 10         ])

(Pdb) p data
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ,
       0.64589411, 0.43758721, 0.891773  , 0.96366276, 0.38344152,
       0.79172504, 0.52889492, 0.56804456, 0.92559664, 0.07103606,
       0.0871293 ])
(Pdb) p fractional_indices
array([  0.        ,  13.83351839,  27.66703678,  41.50055518,
        55.33407357,  69.16759196,  83.00111035,  96.83462875,
       110.66814714, 124.50166553, 138.33518392, 152.16870232,
       166.00222071, 179.8357391 , 193.66925749, 207.50277589])

i'm struggling .. i'm going to skip into the fourier.py data

  4     def create_freq2time(freq_rate, time_rate, freq_count, time_count):
  5         freqs = np.fft.fftfreq(freq_count)
  6         offsets = np.arange(freq_count) * freq_rate / time_rate
  7  ->     mat = np.exp(2j * np.pi * np.outer(freqs, offsets))
  8         return mat / freq_count # scaled to match numpy convention

(Pdb) p freq_rate / time_rate
0.07228818957167302
(Pdb) p offsets
array([0.        , 0.07228819, 0.14457638, 0.21686457, 0.28915276,
       0.36144095, 0.43372914, 0.50601733, 0.57830552, 0.65059371,
       0.7228819 , 0.79517009, 0.86745827, 0.93974646, 1.01203465,
       1.08432284])

huh. it's using the old shorter offsets

(Pdb) p freq_rate, time_rate
(1.1566110331467683, 16)

the rates are samples / unit, I think. time here is recording, and
freq is waveform.
so it's saying the recording goes at 16 samples / unit . the unit must
be the whole recoridng.
the waveform frequency would then be 16 / max_period * 16, I guess.
i'm just passing max_period.

i decided 1 recording sample is 1 time unit which simplifies the
expressions. waveform_rate = waveform_N / max_period. recording_rate =
1

the offsets in create_freq2time are now the same as the fractional
indices in the sampler.
0852

here's [two rows of] the resulting matrix before it's scaled. these
would be the DC frequency multipliers, and then the 1st frequency's
multipliers:

(Pdb) p mat[:2]
array([[ 1.        +0.j        ,  1.        +0.j        ,
         1.        +0.j        ,  1.        +0.j        ,
         1.        +0.j        ,  1.        +0.j        ,
         1.        +0.j        ,  1.        +0.j        ,
         1.        +0.j        ,  1.        +0.j        ,
         1.        +0.j        ,  1.        +0.j        ,
         1.        +0.j        ,  1.        +0.j        ,
         1.        +0.j        ,  1.        +0.j        ],
       [ 1.        +0.j        ,  0.65940045-0.75179189j,
        -0.13038209-0.99146382j, -0.83134847-0.55575149j,
        -0.96600102+0.25853825j, -0.44261455+0.89671197j,
         0.38228055+0.92404631j,  0.94676649+0.32192113j,
         0.86631595-0.49949643j,  0.19573177-0.98065747j,
        -0.60818472-0.79379553j, -0.99780632-0.06620079j,
        -0.70772316+0.70648987j,  0.06446038+0.99792027j,
         0.79273357+0.60956828j,  0.98099736-0.19402106j]])

as i do this i find earlier assertions i can add that simplify the problem.

0854

(Pdb) n
> /shared/src/scratch/test2_upsamplish.py(21)<module>()
-> waveform_freq_2_recording_time =
fourier.create_freq2time(waveform_rate, recording_rate, waveform_N,
recording_N)
(Pdb) n
> /shared/src/scratch/test2_upsamplish.py(22)<module>()
-> assert np.allclose(np.fft.fft(waveform) @
waveform_freq_2_recording_time, recording)
(Pdb) n
> /shared/src/scratch/test2_upsamplish.py(23)<module>()
-> waveform_freq_reconstructed =
np.linalg.solve(waveform_freq_2_recording_time, recording)

It passed the first assertion. The matrix returned from fourier.py
produces the same sampled recording as the sampler function. So it's
all logical errors in running the test.
0855


More information about the cypherpunks mailing list