Цитата(sigmaN @ Sep 18 2009, 03:09)

Код этих техасовских парней у меня не заработал.
Уж не знаю почему они его завалидировали и поставили там галочку.
Не знаю как код а идея у них правильная. Давайте разбираться. Есть сигнал, и мы получили его комплексный спектр A+j*B. Надо взять IFFT и получим снова вещественный сигнал s = IFFT(A+j*B ) = IFFT(A)+j*IFFT(B ). Поскольку А и B вещественные, то IFFT можно заменить на FFT, только на выходе необходимо поделить результат на N (нормировка). Тогда получили s=FFT(A)+j*FFT(B ). А теперь самое главное. Поскольку А - разложение по косинусам а B - разложение по синусам, то FFT(A) = SA - чисто вещественно, а FFT(B ) = j*SB - чисто мнимое. Это значит, что можно заменить два FFT одним следующим образом: S = FFT(A+B ). Тогда S будет содержать комплексные значения и для расчета вещественного сигнала надо s = real(S)+imag(S). Вот матлабовский пример
Код
N = 16;
s = rand(1,N); %случайный входной сигнал
S0=fft(s); %FFT вещественного входного сигнала
A = real(S0); %реалная часть
B = imag(S0); %мнимая часть
%расчет ifft на осове вещесвенного fft
S=fft(A+B); % A+B - чисто вещественно, S - комплексное
s0 = (real(S)+imag(S))/N; % результат IFFT
plot(1:N,s,'-o',1:N,s0)
в вашем случае необходимо учесть, что результат OutBuf содержит только половины спектра, которые надо шаманить зеркально отражая. Но если это все аккуратно сделать то должно работать. Вот матлабовский пример как надо вертеть массивы в вашем случае.
Код
clear all
j = sqrt(-1);
N = 16;
s = rand(1,N); %случайный входной сигнал
S = fft(s);
r = real(S(1:N/2+1)); % это реальная часть половины спектра в OutBuf
i = fliplr(imag(S(2:N/2))); % это мнимая часть половины спектра в OutBuf
r = [r fliplr(r(2:N/2))];% ОТРАЖАЮ зеркально
i = [0 fliplr(i) 0 -i]; % ОТРАЖАЮ зеркально с минусом
s1 = fft(r+i)/N;
s1R = real(s1(1:N/2+1)); % это реальная часть половины спектра в OutBuf при fft(r+i)
s1I = fliplr(imag(s1(2:N/2))); % это мнимая часть половины спектра в OutBuf при fft(r+i)
SR = [s1R fliplr(s1R(2:N/2))];% ОТРАЖАЮ зеркально
SI = [0 fliplr(s1I) 0 -s1I]; % ОТРАЖАЮ зеркально с минусом
s1 = SR+SI;
plot(1:N,s,'-o',1:N,s1)
Ищите ошибку в своем коде должно работать.
Сообщение отредактировал bahurin - Sep 18 2009, 04:12