I'm afraid I don't know of any references on this subject, but I'll try to explain a bit more clearly - and without making too many mistakes this time.
As I understand it, what you are doing is roughly as follows:
You take the first 160 samples, apply a Hanning window, then zero-pad to 512 samples so you can take the DFT. At this stage you should really set the zero-frequency and Nyquist-frequency FFT outputs to zero (the phase is ambiguous at these two points, and it's less likely that you will introduce any audible artefacts if you set the amplitudes to zero, rather than using non-zero but incorrect values).
You then shift the FFT outputs (real and imaginary) up by one bin and perform an IFFT to get an approximation to a Hanning-windowed version of the frequency-shifted signal you require. Just to clarify - the IFFT effectively sums a set of sinewaves with initial phase and amplitude determined by the real and imaginary parts of the FFT bin value. You should (of course) also make sure that the new zero and Nyquist frequency bins are still zeroed at this point.
Finally, you take the first 160 outputs from the IFFT, and add them, starting at the 81st sample, to the next set of outputs, formed by stepping along the input by 80 samples and repeating the above procedure.
It is worth noting that the result of the IFFT operation is only *approximately* Hanning-windowed. Indeed, it was derived from the original Hanning-windowed signal, but because of the effects of frequency-shifting the different frequency components will have increasingly different phase relationships as you progress along the array, and when you get beyond the point where the original signal had ended and the zero-padding had begun (160 samples), there will still be finite (i.e. non-zero) signal energy.
If it were not for the frequency shifting, at every point which was originally zero-padded, the different sinewaves would all cancel out exactly and the output signal would be an exact copy of the input, including the effects of the window. But frequency is just the derivative of the phase of each sinewave, so if you change the frequency of a sinewave, the respective phase will progress at a different rate, and after a while two sinewaves which may originally have reinforced each other (i.e. been "in phase") may cancel each other out (i.e. be "out-of-phase").
So the problem with this overlapped-block approach is that the successive IFFT outputs are not accurately limited to the 160 sample length that your inputs were, and while the total amplitude of 50% overlapped Hanning windows would be constant, when you overlap and add your IFFT outputs, the effective amplitude of the "window" will have been distorted and will not be constant any more.
Further, during the transition between the peak of one window and the next, there will also be periods when the shifted frequency sinewaves from one window, reinforce or cancel those from the other, producing a kind of "beating" effect.
I'm afraid this is getting rather too long and detailed for the general auditory list though, so if you want to discuss it further, I'd suggest we continue off-list.
> Your explaination is reasonable, I do just copy the real and imaginary
On Thu, 24 Jan 2013 10:05:14 +0800
Siping Tao <siping.tao@xxxxxxx> wrote:
> Dear Steve,
> parts without the consideration of phase.> 1. "*by the end of each block, the new signal will have been through a
> I did not fully understand the method you recommended due to my limited
> different number of cycles of each sinusoidal component*"
> what's the meaning of cycles? why overlap processing induces this> 2. "*by converting the phase of each FFT bin to a time delay (rather than a
> phase angle)*"
> how can I get the phase or set the phase for the delayed bin? In> Siping
> overlap case, how to promise each bin has only one phase
> rather than the average of several different phases? Any example code
> or papers, whatever?
> Thanks for your help!
> On Wed, Jan 23, 2013 at 6:48 PM, Steve Beet <steve.beet@xxxxxxxx> wrote:
> > Dear Siping,
> > The most likely explanation is that when you shift the FFT by one bin, you
> > (presumably) just copy the real and imaginary parts, so the initial phase
> > of the respective components stays the same at the new frequency. However,
> > by the end of each block, the new signal will have been through a different
> > number of cycles of each sinusoidal component, so the phase at the end of
> > the frequency-shifted block will not match up with the phase at the start
> > of the next block.
> > Manipulating the phases so that the different components maintain the
> > "correct" phase relationships with the signal components in subsequent
> > blocks could be done by converting the phase of each FFT bin to a time
> > delay (rather than a phase angle), and calculating the phase for the
> > shifted signal which would give the same time delay.
> > There may be other issues too (e.g. the handling of the first and last DFT
> > bins, where there's no phase information), but I would try setting the
> > phase such that the signal at the centre of each overlapped window is
> > "correct", and hope that the taper of the Hanning window will minimise the
> > effect of any discontinuities near the ends of each block.
> > Let us know how you get on!
> > Steve Beet
> > On Wed, 23 Jan 2013 11:05:08 +0100
> > Zlatan Ribic <zlatan@xxxxxxxxxxx> wrote:
> > > M. Hartley Jones: "Frequency Shifter for "Howl" Suppression", Wireless
> > World, July 1973. 317-322
> > >
> > > ----- Original Message -----
> > > From: Siping Tao
> > > To: AUDITORY@xxxxxxxxxxxxxxx
> > > Sent: Wednesday, January 23, 2013 9:56 AM
> > > Subject: Frequency shift to alleviate acoustic feedback
> > >
> > >
> > > Dear experts,
> > >
> > > Acoustic feedback can be removed by several methods: frequency shift,
> > phase shift, notch filter, adaptive cancellation. I tried the simplest
> > method I thought, frqeuency shift. However, it's not easy as I thought. In
> > realtime processing scenario, I need to process every 10ms audio sample
> > without significant delay, so I do the following implementation:
> > >
> > > 1. sampling rate is 16K, so I have 160 samples every 10ms.
> > > 2. do DFT for these 160 samples, the DFT length is 512, pending zeros
> > since I only have 160 samples
> > > 3. shift the frequency by one fft coefficient, that is, shift
> > 16000/512=31.25Hz (DC is not shifted)
> > > 4. do IDFT
> > >
> > > After doing that, I can notice the spectrum is shifted in cool-edit,
> > but with some processing noise (not the artifacts due to frequency shift).
> > I guess this noise is caused by different processing for successive10ms
> > data, I am not sure here. However, I try to use overlap processing in my
> > code, hanning window, 50% overlap, then the processing noise is reduced
> > much. Unfortunately, I found that overlap processing sometimes make the
> > frequency shift useless (e.g. 75% overlap by blackman window), what I mean
> > useless is I cannot notice spectrum shift in cool-edit.
> > >
> > > Can anybody help me to understand why overlap processing hurts
> > frequency shift? Or point out the incorrect parts of my implementation.
> > >
> > > Thanks,
> > > Siping