>since the whole signal has infinite power, the units really
>need to be power per unit frequency per unit time, which
>(confusingly) is the same thing as power.

I think you mean to say "infinite energy" and then "energy per unit
frequency per unit time," no?

E

On Thu, Nov 5, 2015 at 8:21 AM, Ethan Fenn <et...@polyspectral.com> wrote:

> Let's see if I got this right: each bin contains the power for a frequency
>> interval of 2pi/N radians. If I multiply each bin's power by N/2pi I should
>> get power values in units of power/radian.
>>
>
> Sounds reasonable to me, but I'm not sure I've got it right so who knows!
>
> I think I was slightly off when I said that the units of psd are power per
> unit frequency -- since the whole signal has infinite power, the units
> really need to be power per unit frequency per unit time, which
> (confusingly) is the same thing as power. This could be another reason why
> some special scaling is needed as compared to a finite-length FFT.
>
> I'm not sure whether the FFT values should be fringing above the psd line
>> or not:
>
>
> The psd line is the expected value, so some FFT values should be above it
> and some below. You could try averaging the squared spectra from a bunch of
> separate FFT trials and see if that makes things coverge toward the line.
>
> -Ethan
>
>
> On Thu, Nov 5, 2015 at 3:48 PM, Ross Bencina <rossb-li...@audiomulch.com>
> wrote:
>
>> Thanks Ethan,
>>
>> I think that I have it working. It would be great is someone could check
>> the scaling though. I'm not sure whether the FFT values should be fringing
>> above the psd line or not:
>>
>> https://www.dropbox.com/s/txc0txhxqr1t274/SH1_2.png?dl=0
>>
>> I removed the hamming window, which was causing scaling problems. The FFT
>> output is now scaled so that the the sum of power over all bins matches the
>> power of the time domain signal:
>>
>>
>> https://gist.github.com/RossBencina/a15a696adf0232c73a55/bdefe5ab0b5c218a966bd6a04d9d998a708faf99
>>
>>
>> On 6/11/2015 12:02 AM, Ethan Fenn wrote:
>>
>>>     And is psd[w] in exactly the same units as the magnitude squared
>>>     spectrum of x[n] (i.e. |ft(x)|^2)?
>>>
>>>
>>> More or less, with the proviso that you have to be careful whether
>>> you're talking about power per unit frequency which the psd will give
>>> you, and power per frequency bin which is often the correct
>>> interpretation of magnitude squared FFT results -- the latter depending
>>> on the FFT scaling conventions used.
>>>
>>
>> Let's see if I got this right: each bin contains the power for a
>> frequency interval of 2pi/N radians. If I multiply each bin's power by
>> N/2pi I should get power values in units of power/radian.
>>
>>
>> The psd makes no reference to any transform length, since it's based on
>>> the statistical properties of the process. So I think it would be wrong
>>> (or at least inexact) to have a scale related to N applied to it. If you
>>> want the magnitude squared results of an FFT to match the psd, it seems
>>> more correct to scale the FFT and try a few different N's to see what
>>> factor of N will give consistent results.
>>>
>>
>> That makes sense.
>>
>>
>> As to the exact scale that should be applied... I think there should be
>>> a 1/3 in the expression for psd, because E[x^2]=1/3 where x is uniform
>>> in [-1,1]. Aside from that, there might be a factor of 2pi depending on
>>> whether we're talking about power per linear or angular frequency. And
>>> there could be others I'm not thinking of.... maybe someone else can
>>> shed more light here.
>>>
>>
>> I multiplied the psd by 1/3 and as you can see from the graph it looks as
>> though the FFT and the psd are more-or-less aligned.
>>
>>
>> Hope that's somewhat helpful!
>>>
>>
>> Very clear thanks,
>>
>> Ross.
>>
>>
>>
>> -Ethan
>>>
>>>
>>>
>>>
>>> On Thu, Nov 5, 2015 at 11:00 AM, Ross Bencina
>>> <rossb-li...@audiomulch.com <mailto:rossb-li...@audiomulch.com>> wrote:
>>>
>>>     Thanks Ethan(s),
>>>
>>>     I was able to follow your derivation. A few questions:
>>>
>>>     On 4/11/2015 7:07 PM, Ethan Duni wrote:
>>>
>>>         It's pretty straightforward to derive the autocorrelation and
>>>         psd for
>>>         this one. Let me restate it with some convenient notation. Let's
>>> say
>>>         there are a parameter P in (0,1) and 3 random processes:
>>>         r[n] i.i.d. ~U(0,1)
>>>         y[n] i.i.d. ~(some distribution with at least first and second
>>>         moments
>>>         finite)
>>>         x[n] = (r[n]<P)?x[n-1]:y[n]
>>>
>>>         Note that I've switched the probability of holding to P from
>>>         (1-P), and
>>>         that the signal being sampled-and-held can have an arbitrary (if
>>>         well
>>>         behaved) distribution. Let's also assume wlog that E[y[n]y[n]] =
>>> 1
>>>         (Scale the final results by the power of whatever distribution
>>>         you prefer).
>>>
>>>
>>>     So for y[n] ~U(-1,1) I should multiply psd[w] by what exactly?
>>>
>>>
>>>         Now, the autocorrelation function is ac[k] = E[x[n]x[n-k]].
>>>         Let's work
>>>         through the first few values:
>>>         k=0:
>>>         ac[0] = E[x[n]x[n]] = E[y[n]y[n]] = 1
>>>         k=1:
>>>         ac[1] = E[x[n]x[n-1]] = P*E[x[n-1]x[n-1]] + (1-P)*E[x[n-1]y[n]] =
>>>         P*E[y[n]y[n]] = P
>>>
>>>         The idea is that P of the time, x[n] = x[n-1] (resulting in the
>>>         first
>>>         term) and (1-P) of the time, x[n] is a new, uncorrelated sample
>>> from
>>>         y[n]. So we're left with P times the power (assumed to be 1
>>> above).
>>>
>>>         k=2:
>>>         ac[2] = P*P*E[x[n-2]x[n-2]] = P^2
>>>
>>>         Again, we decompose the expected value into the case where x[n]
>>>         = x[n-2]
>>>         - this only happens if both of the previous samples were held
>>>         (probability P^2). The rest of the time - if there was at least
>>> one
>>>         sample event - we have uncorrelated variables and the term drops
>>>         out.
>>>
>>>         So, by induction and symmetry, we conclude:
>>>
>>>     >
>>>
>>>         ac[k] = P^abs(k)
>>>
>>>     >
>>>
>>>         And so the psd is given by:
>>>
>>>         psd[w] = (1 - P^2)/(1 - 2Pcos(w) + P^2)
>>>
>>>
>>>     What is the method that you used to go from ac[k] to psd[w]? Robert
>>>     mentioned that psd was the Fourier transform of ac. Is this
>>>     particular case a standard transform that you knew off the top of
>>>     your head?
>>>
>>>     And is psd[w] in exactly the same units as the magnitude squared
>>>     spectrum of x[n] (i.e. |ft(x)|^2)?
>>>
>>>
>>>         Unless I've screwed up somewhere?
>>>
>>>
>>>     A quick simulation suggests that it might be okay:
>>>
>>>     https://www.dropbox.com/home/Public?preview=SH1_1.png
>>>
>>>
>>>     But I don't seem to have the scale factors correct. The psd has
>>>     significantly smaller magnitude than the fft.
>>>
>>>     Here's the numpy code I used (also pasted below).
>>>
>>>     https://gist.github.com/RossBencina/a15a696adf0232c73a55
>>>
>>>     The FFT output is scaled by (2.0/N) prior to computing the magnitude
>>>     squared spectrum.
>>>
>>>     I have also scaled the PSD by (2.0/N). That doesn't seem quite right
>>>     to me for two reasons: (1) the scale factor is applied to the linear
>>>     FFT, but to the mag squared PSD and (2) I don't have the 1/3 factor
>>>     anywhere.
>>>
>>>     Any thoughts on what I'm doing wrong?
>>>
>>>     Thanks,
>>>
>>>     Ross.
>>>
>>>
>>>     P.S. Pasting the numpy code below:
>>>
>>>     # ---------------8<--------------------------------
>>>     # see
>>>
>>> https://lists.columbia.edu/pipermail/music-dsp/2015-November/000424.html
>>>     # psd derivation due to Ethan Duni
>>>     import numpy as np
>>>     from numpy.fft import fft, fftfreq
>>>     import matplotlib.pyplot as plt
>>>
>>>     N = 16384*2*2*2*2*2 # FFT size
>>>
>>>     y = (np.random.random(N) * 2) - 1 # ~U(-1,1)
>>>     r = np.random.random(N) # ~U(0,1)
>>>     x = np.empty(N) # (r[n]<P)?x[n-1]:y[n]
>>>
>>>     # hold process with probability of P for holding
>>>     P = 0.9
>>>     x[0] = 0
>>>     for i in range(1,N-1):
>>>          if r[i] < P:
>>>              x[i] = x[i-1]
>>>          else:
>>>              x[i] = y[i]
>>>
>>>     # FFT of x
>>>     window = np.hamming(N)
>>>     spectrum = fft(x*window,N)
>>>     magnitudeSq = ((2.0/N) * np.abs(spectrum)) ** 2
>>>
>>>     # Calculate PSD
>>>     w = fftfreq(N)*np.pi*2 # (w from 0 to 0.5 then -0.5 to 1
>>>     psd = ((1.0 - P**2)/(1.0 - 2*P*np.cos(w) + P**2))
>>>
>>>     psd = psd*(2.0/N) # not sure about this
>>>
>>>     plt.plot(w, magnitudeSq)
>>>     plt.plot(w, psd, color='red')
>>>     plt.xscale('log')
>>>     plt.yscale('log')
>>>     plt.show()
>>>     # ---------------8<--------------------------------
>>>
>>>
>>>
>>>
>>>
>>>     _______________________________________________
>>>     dupswapdrop: music-dsp mailing list
>>>     music-dsp@music.columbia.edu <mailto:music-dsp@music.columbia.edu>
>>>     https://lists.columbia.edu/mailman/listinfo/music-dsp
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> dupswapdrop: music-dsp mailing list
>>> music-dsp@music.columbia.edu
>>> https://lists.columbia.edu/mailman/listinfo/music-dsp
>>>
>>> _______________________________________________
>> dupswapdrop: music-dsp mailing list
>> music-dsp@music.columbia.edu
>> https://lists.columbia.edu/mailman/listinfo/music-dsp
>>
>
>
> _______________________________________________
> dupswapdrop: music-dsp mailing list
> music-dsp@music.columbia.edu
> https://lists.columbia.edu/mailman/listinfo/music-dsp
>
_______________________________________________
dupswapdrop: music-dsp mailing list
music-dsp@music.columbia.edu
https://lists.columbia.edu/mailman/listinfo/music-dsp

Reply via email to