БПФ (нюансы)

ЦОС, обработка видео и изображений в MATLAB\Simulink

Модератор: Admin

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

БПФ (нюансы)

Сообщение aBoomest » Вс май 12, 2019 11:38 am

Доброго дня.
Понятно, что темы про фурье поднимались миллион раз, но меня интересует один нюанс который я не могу прочувствовать до конца.
Объясню на примере:
Дано: входной сигнал - черный ящик имеющий АФЧХ - выходной сигнал.
черный ящик имеющий АФЧХ - может быть что угодно - не важно. Для определенности пусть будет фильтр.

Ситуация 1
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Делаю обратное БПФ (ОБПФ) - на выходе получаю последовательность действительных чисел. (Мнимой части вроде как и не должно быть) Сигнал после преобразования туда-сюда полностью совпадает с исходным.

Ситуация 2
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Умножаю комплексный спектр на АФЧХ фильтра. На выходе комплексный спектр уже выходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел. (вот это и не ясно!!!)

От него, как я понимаю надо брать RE часть - и это будет сигнал на выходе фильтра.
А в чем физический смысл мнимой части?
И получается что для Ситуации 1 как бы формально мнимая часть в выходном сигнале тоже есть, только она стремится к нулю?

С уважением, Анатолий.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: БПФ (нюансы)

Сообщение sandy » Вс май 12, 2019 7:36 pm

3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел. (вот это и не ясно!!!)

Если правильно делаете, то не будет там комплексных чисел (ну разве что мнимая часть порядка e-13 из-за вычислительных погрешностей). Вы, вероятно, забываете, что частотная характеристика вещественной системы обладает комплексно-сопряженной симметрией относительно нулевой частоты.
С уважением

Александр Сергиенко

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Пн май 13, 2019 8:22 am

Спасибо за ответ.
1. Любая система такая? Хоть датчик, хоть микрофон, хоть фильтр - все имеют такую симметрию?
2. Т.е. я в отрицательную сторону жополняю АФЧХ системы комплексносопряженным ''отражением''?

3. А как я это на АФЧХ входного сигнала помножу? Они же разной длины? У сигнала что тоже сделать тоже самое с частотной характеристикой?
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Пн май 13, 2019 1:27 pm

Добрый день, еще раз.
Почитал про это. теоретически вроде стало понятнее. Но как с этим всем на практике быть?

И еще вопрос, тоже наверно проще на примере том же.
Ситуация 2 (из первого поста):
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Умножаю комплексный спектр на АФЧХ фильтра. На выходе комплексный спектр уже выходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел.
4. Беру RE часть от этого.

Ситуация 3:
1. Делаю БПФ входного сигнала. На выходе комплексный спектр. Достраиваю в отрицательную область.
2. АФЧХ фильтра тоже достраиваю только уже комплексно сопряженной левой частью. Перемножаю спектры. На выходе комплексный спектр вЫходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность (судя по теории) действительных чисел.

Эти два алгоритма дадут одно и тоже?
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Пн май 13, 2019 10:05 pm

Подскажите пожалуйста, что делать-то?Попробовал достроить спектр просто для начала входного сигнала в отрицательную область - обратное преобразование этого вобще ерундистическое получается какое-то. Не пойму что со всем этим теперь делать?
П.С.: спектр входного сигнала достраивал без комрлексного сопряжения. По теории вроде бы как это так.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: БПФ (нюансы)

Сообщение sandy » Вт май 14, 2019 12:48 pm

1. Любая система такая?

Я же написал - вещественная система, то есть система с вещественной импульсной характеристикой.
2. Т.е. я в отрицательную сторону жополняю АФЧХ системы комплексносопряженным ''отражением''?

Не "дополняете", а правильно рассчитываете на нужных частотах.
3. А как я это на АФЧХ входного сигнала помножу? Они же разной длины?

Они одинаковой длины, так как не нужно ничего "дополнять".
У сигнала что тоже сделать тоже самое с частотной характеристикой?

Если вы под спектром сигнала подразумеваете БПФ, то там уже все симметрично. Если, конечно, сигнал был вещественный.
Ситуация 2 (из первого поста):
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел.

Как я уже писал, если здесь все сделано правильно, последовательность получится вещественная.
Ситуация 3:
1. Делаю БПФ входного сигнала. На выходе комплексный спектр. Достраиваю в отрицательную область.

У вас здесь уже есть "отрицательная область".
2. АФЧХ фильтра тоже достраиваю только уже комплексно сопряженной левой частью. Перемножаю спектры. На выходе комплексный спектр вЫходного сигнала.

А вот ЧХ фильтра нужно рассчитать на правильных частотах, понимая, что вторая половина вектора результатов БПФ - это и есть отрицательные частоты.
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Вт май 14, 2019 2:42 pm

Спасибо большое!
Начинаю думать, что у меня система и правда имеет комплексные коэффициенты. Тут я пока не могу делать выводы.

Сделал тестовый расчет на простом фильтре с реально действительными коэффициентами. (см.картинку) В принципе там все подписано. Вопрос левом столбике:
- первый график - все как в аптеке
- второй - просто для сравнения сделал фильтрацию функцией filter
- третий - ОТКУДА МНИМАЯ СОСТАВЛЯЮЩАЯ? Что не так делаю? Спектры правильные (справа)?
PS: Можете ещё прокомментировать про переходный процесс в начале (обведено), почему в одном случае есть, в другом нет. Я на ощупь то понимаю, что так и должно быть, но вот умных слов бы бы услышать - чего как и откуда - очень помогло бы.
Заранее благодарен. С уважением, Анатолий.
Полноэкранная картинка
Изображение
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: БПФ (нюансы)

Сообщение sandy » Вт май 14, 2019 3:35 pm

Если присмотреться к верхнему правому графику, видно, что спектр сигнала и АЧХ фильтра справа и слева соотносятся чуть-чуть по-разному. Возможно, здесь типичная проблема "плюс-минус один".

Вот пример. Пусть длина сигнала составляет 100 отсчетов. После БПФ вы получаете 100 спектральных отсчетов с матлабовской нумерацией 1...100. В этом векторе:

Элемент номер 1 соответствует нулевой частоте
Элементы 2...50 (49 штук) соответствуют положительным частотам
Элемент 51 соответствует частоте Найквиста
Элементы 52...100 (49 штук) соответствуют отрицательным частотам
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Вт май 14, 2019 7:32 pm

Прошу прощения. И понял и не понял одновременно.
Проанализировал свой спектр, он такой: справа как бы на 1 точку меньше. (см.рис.)
Сигнал у меня 128 точек. Специально подобрал так чтоб не было всяких "достраиваний".
В спектре тоже получается на выходе 128 точек.
При этом 2-я точка и 128-я точка одинаковые. А для 1-й точки пары нету. Ночто-то думается что дело не в этом.
После картинки привел код БПФ и ОБПФ. Пользуюсь функциями этими уже почти 10 лет. Ужас наводит если это было неправильно.
Картинка
Изображение
ОБПФ

Код: Выделить всё

function [Time,ReConstructInSignal] = GetInvDFT(Spectrum,DiscretteFrequency)
  Count = length(Spectrum);
  ReConstructInSignal = Count*ifft(idftSpectrum)/2;
  ReConstructInSignal = real(ReConstructInSignal);
  Time = transpose(0:1:Count-1)/DiscretteFrequency;
end

БПФ

Код: Выделить всё

function [FreqList,Spectrum] = GetFFT(Time,InputSignal,DiscretteFrequency) 
  Count = length(InputSignal);
  TimeLength = length(Time);
  NFFT = 2^nextpow2(TimeLength);
  FreqList = DiscretteFrequency*transpose(linspace(0,1,NFFT));
  Spectrum = 2*fft(InputSignal,NFFT)/TimeLength;
  FreqList = FreqList(1:Count);
  Spectrum = Spectrum(1:Count);
end
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: БПФ (нюансы)

Сообщение sandy » Ср май 15, 2019 12:06 am

В функции GetFFT частотная ось рассчитывается неверно. И две последние строки портят результат.

Код: Выделить всё

FreqList = DiscretteFrequency*transpose(linspace(0,1,NFFT));

Это неправильно. Должно быть что-то типа

Код: Выделить всё

FreqList = DiscretteFrequency*(0:NFFT-1).'/NFFT;

А эти строки нужно просто удалить:

Код: Выделить всё

FreqList = FreqList(1:Count);
Spectrum = Spectrum(1:Count);
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Ср май 15, 2019 8:25 am

Просто супер!!!
ПРЕБОЛЬШОЕ СПАСИБО!!!
PS: А где можно почитать про то какие системы (желательно примерами из физики) когда на выходе получается комплексный сигнал а не вещественный?
PSPS: Еще раз огромное спасибо! Камень с плеч.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: БПФ (нюансы)

Сообщение sandy » Ср май 15, 2019 7:55 pm

А где можно почитать про то какие системы (желательно примерами из физики) когда на выходе получается комплексный сигнал а не вещественный?

При чем здесь физика? Тут исключительно математика...
https://books.google.ru/books?id=0Wk7AgAAQBAJ&lpg=PA81&dq=%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB&hl=ru&pg=PA76#v=onepage&q=%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB&f=false
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Пт май 17, 2019 2:56 pm

Спасибо.
Такой тогда вопрос.
1. Есть вещественный сигнал. В БПФ сигнала на частотах от 0 до Fs имеется "зеркальность". (Если использовать ДПФ (не быстрое - обычное), то "зеркальность также имеет место").
2. На выходе реальной схемы тоже вещественный сигнал, это вроде факт. АФЧХ схемы я расчитываю по формуле для этой схемы. По этой формуле я никакую "зеркальность" (с комплексносопряженностью) в АЧХ не получу, т.к. это просто формула передаточной функции.

Как получить реальный сигнал выхода?

Вы говорили, что искусственно "зеркально" достраивать АФЧХ схемы относительно Fs/2 не нужно. А как тогда быть? Что делать чтобы получить реальный сигнал выхода. Причем чтоб после ОБПФ мнимой части в сигнале не было (...e-10).
Или может всетаки т.к. у нас имеется дискретизированность (а как следствие - зеркальность), то может всетаки надо в АФЧХ реальной схемы тоже как-то вводить каким-то образом "зеркальность"? Т.е. "дискретизировать" схему, если можно так вывразиться.

С уважением, Анатолий Бычков.
PS: очень вам благодарен, мало где таких нюансов узнаешь. За неделю узнал очень много интересного.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: БПФ (нюансы)

Сообщение sandy » Пт май 17, 2019 5:17 pm

Все, что нужно - правильно понимать, на каких частотах нужно рассчитывать ЧХ аналоговой цепи.
Пример: пропускание прямоугольного импульса через интегрирующую RC-цепочку.

Код: Выделить всё

fd = 10e3; % частота дискретизации
T = 100e-3; % длительность анализируемого фрагмента сигнала
NT = round(T*fd); % число отсчетов в анализируемом фрагменте
T_pulse = 10e-3; % длительность импульса
Npulse = round(T_pulse*fd); % число отсчетов в импульсе
x = zeros(1,NT);
x(1:Npulse) = 1; % прямоугольный импульс
xf = fft(x); % ДПФ
f = (0:NT-1)*fd/NT; % односторонняя частотная ось
f(ceil(NT/2)+1:end) = f(ceil(NT/2)+1:end) - fd; % двусторонняя частотная ось
if ~mod(NT,2) % если в наборе частот есть частота Найквиста
    f(NT/2+1) = inf;
end
tau = 5e-3; % постоянная времени RC-цепочки
H = 1./(1+2i*pi*f*tau); % ЧХ цепи
yf = xf.*H; % ДПФ выходного сигнала
y = ifft(yf); % выходной сигнал во временной области
t = (0:NT-1)/fd; % вектор времени
plot(t, y)
С уважением



Александр Сергиенко

aBoomest
Пользователь
Сообщения: 267
Зарегистрирован: Чт июл 10, 2008 5:35 pm

Re: БПФ (нюансы)

Сообщение aBoomest » Чт май 23, 2019 11:31 am

Спасибо. Прошу прощения за задержку, нахожуь в командировке.
Т.е. для аналоговой цепи (и не важно цепи или нет, а просто абстрактной системы у которой известно, что выходной сигнал вещественный) нужно афчх строить от -fs/2 до +fs/2 ? И часть спектра входного сигнала для перемножения спектров соответственно надо переносить в область отрицательных частот?
С уважением, Анатолий.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./