Yes, thank you! I guess most of the places I typed the word power I really meant energy... units are hard...
-Ethan On Thu, Nov 5, 2015 at 7:33 PM, Ethan Duni <ethan.d...@gmail.com> wrote: > >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 >
_______________________________________________ dupswapdrop: music-dsp mailing list music-dsp@music.columbia.edu https://lists.columbia.edu/mailman/listinfo/music-dsp