I don't understand why FFT return different maximum amplitude as the signal length increase. I would except that with a large signal length according to the frequency, detected amplitude will be very accurate.

![Plot amplitude from FFT against signal length][1]


  [1]: https://i.sstatic.net/DgHuR.png

From where this periodic signal is coming ?

Here is the related python code I used to generate the plot:

    %matplotlib qt
    %load_ext autoreload
    %autoreload 2

    import numpy as np
    import matplotlib.pyplot as plt

    def get_fft(x, dt):
        n = len(x)
        fft_output = np.fft.rfft(x)
        rfreqs = np.fft.rfftfreq(n, d=dt)
        fft_mag = [np.sqrt(i.real ** 2 + i.imag ** 2) / n for i in fft_output]
        return np.array(fft_mag), np.array(rfreqs)

    def build_signal(amp, freq, signal_len):
        
        f = freq
        A = amp
        dt = 1
        t = signal_len

        x = np.arange(0, t, dt)
        y = A * np.cos(2*np.pi*f*x)

        fft_mag, rfreqs = get_fft(y, dt)
        return x, y, fft_mag, rfreqs, amp, freq, signal_len

    # Build sin wave from 1 to 5000 signal length with freq=1e-3Hz and amplitude=0.5
    all_t = []
    all_amp = []
    for t in np.arange(1, 5000, 100):
        x, y, fft_mag, rfreqs, amp, freq, signal_len = build_signal(amp=0.5, freq=0.001, signal_len=t)

        fft_amp = fft_mag[fft_mag.argsort()][::-1][0]
        
        all_t.append(t)
        all_amp.append(fft_amp)
        
    # Plot amplitude from FFT against signal length
    plt.figure()
    plt.plot(all_t, all_amp, 'o-')
    plt.xlabel("Signal length")
    plt.ylabel("Amplitude from FFT (0.25 is excepted)")