Цитата(shasik @ Oct 18 2007, 11:05)

Ну, тогда ладно, уговорили! Сдаемся! Говорите отгадку - что неправильно?
ЗЫ: расшифруйте понятие "неправильно" (архивчик с тестовым сигналом; с тем, что должно было получиться; с тем, что получилось на сам деле и с отсчетами фильтра очень помог бы).
Я не знаю что неправильно. Дело в том, что метод разделения отклика на положительный и отрицательный работает и на моем БПФ и мне этого достаточно.
Вот рабочая свертка:
Код
//быстрая свертка
void COOLibin_math::fastconvolution(std::vector<double>& Signal,
const std::vector<double>& Responce,
uint uPositiveLen)
{
std::vector<std::complex<double> > SignalCx, ResponceCx;
uint uConvLen, uSignalLen, uNegativeLen;
size_t i;
uSignalLen = Signal.size();
uNegativeLen = Responce.size() - uPositiveLen - 1;
uConvLen = uSignalLen;
if(uNegativeLen > uPositiveLen ){
uConvLen += uNegativeLen;
}
else{
uConvLen += uPositiveLen;
}
if( uNegativeLen + uPositiveLen + 1 > uConvLen ){
uConvLen = uNegativeLen + uPositiveLen + 1;
}
i = 1;
while(i < uConvLen)
{
i = i*2;
}
uConvLen = i;
SignalCx.resize(uConvLen);
ResponceCx.resize(uConvLen);
for(i = 0; i != uSignalLen; i++){
SignalCx[i] = std::complex<double>(Signal[i], 0.0);
}
for(i = uSignalLen; i != uConvLen; i++){
SignalCx[i] = std::complex<double>(0.0, 0.0);
}
for(i = 0; i != uConvLen; i++){
ResponceCx[i] = std::complex<double>(0.0, 0.0);
}
for(i = 0; i <= uPositiveLen; i++){
ResponceCx[i] = std::complex<double>(Responce[i + uNegativeLen], 0.0);
}
for(i = 1; i <= uNegativeLen; i++){
ResponceCx[uConvLen - i] = std::complex<double>(Responce[uNegativeLen - i], 0.0);
}
fft(SignalCx, false);
fft(ResponceCx, false);
for(i = 0; i != uConvLen; i++){
SignalCx[i] *= ResponceCx[i];
}
fft(SignalCx, true);
for(i = 0; i != uSignalLen; i++){
Signal[i] = SignalCx[i].real();
}
}
А это сам БПФ:
Код
void COOLibin_math::rec_fft(std::vector<std::complex<double> >& Signal,
bool bInv){
uint uSignalLen = Signal.size();
if(uSignalLen == 1){
return;
}
const double PI = 3.1415926535897932;
std::vector<std::complex<double> > Odd(uSignalLen/2), Even(uSignalLen/2);
for(size_t i = 0; i != uSignalLen/2; i++){
Odd[i] = Signal[2*i];
Even[i] = Signal[2*i + 1];
}
rec_fft(Odd, bInv);
rec_fft(Even, bInv);
double fSign;
if(!bInv){
fSign = 1.0;
}
else{
fSign = -1.0;
}
std::complex<double> W(1.0, 0.0), WStep(cos(2.0*PI/uSignalLen), sin(fSign*2.0*PI/uSignalLen)), Temp;
for(size_t k = 0; k != uSignalLen/2; k++){
Temp = W*Even[k];
Signal[k] = Odd[k] + Temp;
Signal[k + uSignalLen/2] = Odd[k] - Temp;
W *= WStep;
}
}
void COOLibin_math::fft(std::vector<std::complex<double> >& Signal,
bool bInv){
rec_fft(Signal, bInv);
if(bInv){
uint uSignalLen = Signal.size();
for(std::vector<std::complex<double> >::iterator it = Signal.begin(); it != Signal.end(); it++){
(*it) /= uSignalLen;
}
}
}