Ask about FHT code

Hello ! Very nice to meet you, guys ! I’m Hoang from Vietnam. I’m trying to learn Arduino. I’m doing a small project call spectrum analyzer on Arduino but I found some really intelligible sentences in the code of FHT. Here is the code:
cli();
for (int x=0; x<FHT_N; x++) {
while(!(ADCSRA & 0x10));
ADCSRA = 0xf5;
if (sampleSet == “L”) {
ADMUX = 0x40;
} else {
ADMUX = 0x41;
}
byte m = ADCL;
byte j = ADCH;
int k = ( j << 8 ) | m; // form into an int
k -= 0x0200; // form into a signed int
k <<= 6; // form into a 16b signed int
fht_input= k; // put real data into bins

}
sei();
I have a question about this code: Why do we have to put the output of ADC into a signed int and form it into a 16b signed int. What is this technique about ?
Hope to see your answers soon !
Thank you very much !

Audio goes positive and negative. The ADC only works on positive values so 2.5V is added to the audio to center it in the available range (0V to 5V). Subtracting 512 (0x0200) removes that 2.5V offset.

I think that shifting the 10-bit values from the ADC into higher bits makes better use of the dynamic range of the FFT. If the input values were left in the range -512 to +512 the output values will also be in that range. Since the 16-bit FFT can handle values +/- 32767 you get more precise answers when you 'amplify' the input values to cover a wider range.