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