###

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

`dcells`

^{11.21}simply forms a cell array in matlab containing the spectral partition (``dyadic cells''). The function

`dcells2spec`

^{11.22}is 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