Spectral Rotation of Real Signals
Note that if we rotate the spectrum of a real signal by half a
bin, we obtain
positive-frequency samples and
negative-frequency samples, with no sample at dc or at the Nyquist
limit. This is typically desirable for audio signals because dc is
inaudible and the Nyquist limit is a degenerate point of the spectrum
that, for example, cannot have a phase other than 0 or
. If
is a power of 2, then so is
, and the octave-band partitioning of
the previous subsection can be applied separately to each half of the
spectrum:
N = 32; x = randn(1,N); % Specific example LN = round(log2(N)); % number of octave bands shifter = exp(-j*pi*[0:N-1]/N); % half-bin xs = x .* shifter; % apply spectral shift X = fft(xs,N); % project xs onto rotated basis XP = X(1:N/2); % positive-frequency components XN = X(N:-1:N/2+1); % neg.-frequency components YP = dcells(XP); % partition to octave bands YN = dcells(XN); % ditto for neg. frequencies YPe = dcells2spec(YP); % unpack "dyadic cells" YNe = dcells2spec(YN); % unpack neg. freqs YNeflr = fliplr(YNe); % undo former flip ys = ifft([YPe,YNeflr],N,2); y = real(ones(LN,1)*conj(shifter) .* ys); % = octave filter-bank signals (real) yr = sum(y); % filter-bank sum (should equal x) yrerr = x - yr; disp(sprintf(... 'Total filter-bank sum L2 error = %0.2f %%',... 100*norm(yrerr)/norm(x)));In the above listing, the function dcells11.21simply forms a cell array in matlab containing the spectral partition (``dyadic cells''). The function dcells2spec11.22is the inverse of dcells, taking a spectral partition and unpacking it to produce a usual spectrum vector.
Next Section:
Improving the Octave Band Filters
Previous Section:
Fast Octave Filter Banks