Mercurial > octave-dspies
comparison scripts/signal/periodogram.m @ 18998:956fc864c39f
periodogram.m: Fix bug when nfft < length (x) and "onesided" specified (bug #42859).
* periodogram.m: Don't use nargin to decide when normalized frequencies should
be used. Instead check whether Fs has been specified to make the decision.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 07 Aug 2014 20:24:59 -0700 |
parents | 8ac4ab4ae5f4 |
children |
comparison
equal
deleted
inserted
replaced
18997:bd1a5149c53e | 18998:956fc864c39f |
---|---|
84 if (nargin < 1 || nargin > 5) | 84 if (nargin < 1 || nargin > 5) |
85 print_usage (); | 85 print_usage (); |
86 endif | 86 endif |
87 | 87 |
88 nfft = fs = range = window = []; | 88 nfft = fs = range = window = []; |
89 j = 1; | 89 j = 2; |
90 for k = 1:length (varargin) | 90 for k = 1:length (varargin) |
91 if (ischar (varargin{k})) | 91 if (ischar (varargin{k})) |
92 range = varargin{k}; | 92 range = varargin{k}; |
93 else | 93 else |
94 switch (j) | 94 switch (j) |
95 case 1 | 95 case 2 |
96 window = varargin{k}; | 96 window = varargin{k}; |
97 case 2 | 97 case 3 |
98 nfft = varargin{k}; | 98 nfft = varargin{k}; |
99 case 3 | 99 case 4 |
100 fs = varargin{k}; | 100 fs = varargin{k}; |
101 case 4 | |
102 range = varargin{k}; | |
103 endswitch | 101 endswitch |
104 j++; | 102 j++; |
105 endif | 103 endif |
106 endfor | 104 endfor |
107 | 105 |
122 | 120 |
123 if (isempty (nfft)) | 121 if (isempty (nfft)) |
124 nfft = max (256, 2.^nextpow2 (n)); | 122 nfft = max (256, 2.^nextpow2 (n)); |
125 elseif (! isscalar (nfft)) | 123 elseif (! isscalar (nfft)) |
126 error ("periodogram: NFFT must be a scalar"); | 124 error ("periodogram: NFFT must be a scalar"); |
125 endif | |
126 | |
127 use_w_freq = isempty (fs); | |
128 if (! use_w_freq && ! isscalar (fs)) | |
129 error ("periodogram: FS must be a scalar"); | |
127 endif | 130 endif |
128 | 131 |
129 if (strcmpi (range, "onesided")) | 132 if (strcmpi (range, "onesided")) |
130 range = 1; | 133 range = 1; |
131 elseif (strcmpi (range, "twosided")) | 134 elseif (strcmpi (range, "twosided")) |
150 if (! isempty (window)) | 153 if (! isempty (window)) |
151 n = sumsq (window); | 154 n = sumsq (window); |
152 endif; | 155 endif; |
153 Pxx = (abs (fft (x, nfft))) .^ 2 / n; | 156 Pxx = (abs (fft (x, nfft))) .^ 2 / n; |
154 | 157 |
155 if (nargin < 4) | 158 if (use_w_freq) |
156 Pxx /= 2*pi; | 159 Pxx /= 2*pi; |
157 elseif (! isempty (fs)) | 160 else |
158 Pxx /= fs; | 161 Pxx /= fs; |
159 endif | 162 endif |
160 | 163 |
161 ## generate output arguments | 164 ## generate output arguments |
162 | 165 |
174 if (range == 1) | 177 if (range == 1) |
175 f = (0:nfft/2)' / nfft; | 178 f = (0:nfft/2)' / nfft; |
176 elseif (range == 2) | 179 elseif (range == 2) |
177 f = (0:nfft-1)' / nfft; | 180 f = (0:nfft-1)' / nfft; |
178 endif | 181 endif |
179 if (nargin < 4) | 182 if (use_w_freq) |
180 f *= 2*pi; # generate w=2*pi*f | 183 f *= 2*pi; # generate w=2*pi*f |
181 elseif (! isempty (fs)) | 184 else |
182 f *= fs; | 185 f *= fs; |
183 endif | 186 endif |
184 endif | 187 endif |
185 | 188 |
186 if (nargout == 0) | 189 if (nargout == 0) |
187 if (nargin < 4) | 190 if (use_w_freq) |
188 plot (f/(2*pi), 10*log10 (Pxx)); | 191 plot (f/(2*pi), 10*log10 (Pxx)); |
189 xlabel ("normalized frequency [x pi rad]"); | 192 xlabel ("normalized frequency [x pi rad]"); |
190 ylabel ("Power density [dB/rad/sample]"); | 193 ylabel ("Power density [dB/rad/sample]"); |
191 else | 194 else |
192 plot (f, 10*log10 (Pxx)); | 195 plot (f, 10*log10 (Pxx)); |
210 %!error periodogram (1,2,3,4,5,6) | 213 %!error periodogram (1,2,3,4,5,6) |
211 %!error <X must be a real or complex vector> periodogram (ones (2,2)) | 214 %!error <X must be a real or complex vector> periodogram (ones (2,2)) |
212 %!error <WIN must be a vector.*same length> periodogram (1:5, ones (2,2)) | 215 %!error <WIN must be a vector.*same length> periodogram (1:5, ones (2,2)) |
213 %!error <WIN must be a vector.*same length> periodogram (1:5, 1:6) | 216 %!error <WIN must be a vector.*same length> periodogram (1:5, 1:6) |
214 %!error <NFFT must be a scalar> periodogram (1:5, 1:5, 1:5) | 217 %!error <NFFT must be a scalar> periodogram (1:5, 1:5, 1:5) |
218 %!error <FS must be a scalar> periodogram (1:5, [], [], 1:5) | |
215 %!error <"centered" range type is not implemented> periodogram (1:5, "centered") | 219 %!error <"centered" range type is not implemented> periodogram (1:5, "centered") |
216 | 220 |