БПФ (нюансы)
Модератор: Admin
БПФ (нюансы)
Доброго дня.
Понятно, что темы про фурье поднимались миллион раз, но меня интересует один нюанс который я не могу прочувствовать до конца.
Объясню на примере:
Дано: входной сигнал - черный ящик имеющий АФЧХ - выходной сигнал.
черный ящик имеющий АФЧХ - может быть что угодно - не важно. Для определенности пусть будет фильтр.
Ситуация 1
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Делаю обратное БПФ (ОБПФ) - на выходе получаю последовательность действительных чисел. (Мнимой части вроде как и не должно быть) Сигнал после преобразования туда-сюда полностью совпадает с исходным.
Ситуация 2
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Умножаю комплексный спектр на АФЧХ фильтра. На выходе комплексный спектр уже выходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел. (вот это и не ясно!!!)
От него, как я понимаю надо брать RE часть - и это будет сигнал на выходе фильтра.
А в чем физический смысл мнимой части?
И получается что для Ситуации 1 как бы формально мнимая часть в выходном сигнале тоже есть, только она стремится к нулю?
С уважением, Анатолий.
Понятно, что темы про фурье поднимались миллион раз, но меня интересует один нюанс который я не могу прочувствовать до конца.
Объясню на примере:
Дано: входной сигнал - черный ящик имеющий АФЧХ - выходной сигнал.
черный ящик имеющий АФЧХ - может быть что угодно - не важно. Для определенности пусть будет фильтр.
Ситуация 1
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Делаю обратное БПФ (ОБПФ) - на выходе получаю последовательность действительных чисел. (Мнимой части вроде как и не должно быть) Сигнал после преобразования туда-сюда полностью совпадает с исходным.
Ситуация 2
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Умножаю комплексный спектр на АФЧХ фильтра. На выходе комплексный спектр уже выходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел. (вот это и не ясно!!!)
От него, как я понимаю надо брать RE часть - и это будет сигнал на выходе фильтра.
А в чем физический смысл мнимой части?
И получается что для Ситуации 1 как бы формально мнимая часть в выходном сигнале тоже есть, только она стремится к нулю?
С уважением, Анатолий.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./
Re: БПФ (нюансы)
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел. (вот это и не ясно!!!)
Если правильно делаете, то не будет там комплексных чисел (ну разве что мнимая часть порядка e-13 из-за вычислительных погрешностей). Вы, вероятно, забываете, что частотная характеристика вещественной системы обладает комплексно-сопряженной симметрией относительно нулевой частоты.
С уважением
Александр Сергиенко
Александр Сергиенко
Re: БПФ (нюансы)
Спасибо за ответ.
1. Любая система такая? Хоть датчик, хоть микрофон, хоть фильтр - все имеют такую симметрию?
2. Т.е. я в отрицательную сторону жополняю АФЧХ системы комплексносопряженным ''отражением''?
3. А как я это на АФЧХ входного сигнала помножу? Они же разной длины? У сигнала что тоже сделать тоже самое с частотной характеристикой?
1. Любая система такая? Хоть датчик, хоть микрофон, хоть фильтр - все имеют такую симметрию?
2. Т.е. я в отрицательную сторону жополняю АФЧХ системы комплексносопряженным ''отражением''?
3. А как я это на АФЧХ входного сигнала помножу? Они же разной длины? У сигнала что тоже сделать тоже самое с частотной характеристикой?
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./
Re: БПФ (нюансы)
Добрый день, еще раз.
Почитал про это. теоретически вроде стало понятнее. Но как с этим всем на практике быть?
И еще вопрос, тоже наверно проще на примере том же.
Ситуация 2 (из первого поста):
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Умножаю комплексный спектр на АФЧХ фильтра. На выходе комплексный спектр уже выходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел.
4. Беру RE часть от этого.
Ситуация 3:
1. Делаю БПФ входного сигнала. На выходе комплексный спектр. Достраиваю в отрицательную область.
2. АФЧХ фильтра тоже достраиваю только уже комплексно сопряженной левой частью. Перемножаю спектры. На выходе комплексный спектр вЫходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность (судя по теории) действительных чисел.
Эти два алгоритма дадут одно и тоже?
Почитал про это. теоретически вроде стало понятнее. Но как с этим всем на практике быть?
И еще вопрос, тоже наверно проще на примере том же.
Ситуация 2 (из первого поста):
1. Делаю БПФ входного сигнала. На выходе комплексный спектр.
2. Умножаю комплексный спектр на АФЧХ фильтра. На выходе комплексный спектр уже выходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел.
4. Беру RE часть от этого.
Ситуация 3:
1. Делаю БПФ входного сигнала. На выходе комплексный спектр. Достраиваю в отрицательную область.
2. АФЧХ фильтра тоже достраиваю только уже комплексно сопряженной левой частью. Перемножаю спектры. На выходе комплексный спектр вЫходного сигнала.
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность (судя по теории) действительных чисел.
Эти два алгоритма дадут одно и тоже?
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./
Re: БПФ (нюансы)
Подскажите пожалуйста, что делать-то?Попробовал достроить спектр просто для начала входного сигнала в отрицательную область - обратное преобразование этого вобще ерундистическое получается какое-то. Не пойму что со всем этим теперь делать?
П.С.: спектр входного сигнала достраивал без комрлексного сопряжения. По теории вроде бы как это так.
П.С.: спектр входного сигнала достраивал без комрлексного сопряжения. По теории вроде бы как это так.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./
Re: БПФ (нюансы)
1. Любая система такая?
Я же написал - вещественная система, то есть система с вещественной импульсной характеристикой.
2. Т.е. я в отрицательную сторону жополняю АФЧХ системы комплексносопряженным ''отражением''?
Не "дополняете", а правильно рассчитываете на нужных частотах.
3. А как я это на АФЧХ входного сигнала помножу? Они же разной длины?
Они одинаковой длины, так как не нужно ничего "дополнять".
У сигнала что тоже сделать тоже самое с частотной характеристикой?
Если вы под спектром сигнала подразумеваете БПФ, то там уже все симметрично. Если, конечно, сигнал был вещественный.
Ситуация 2 (из первого поста):
3. Делаю ОБПФ полученного спектра - на выходе получаю последовательность уже комплексных чисел.
Как я уже писал, если здесь все сделано правильно, последовательность получится вещественная.
Ситуация 3:
1. Делаю БПФ входного сигнала. На выходе комплексный спектр. Достраиваю в отрицательную область.
У вас здесь уже есть "отрицательная область".
2. АФЧХ фильтра тоже достраиваю только уже комплексно сопряженной левой частью. Перемножаю спектры. На выходе комплексный спектр вЫходного сигнала.
А вот ЧХ фильтра нужно рассчитать на правильных частотах, понимая, что вторая половина вектора результатов БПФ - это и есть отрицательные частоты.
С уважением
Александр Сергиенко
Александр Сергиенко
Re: БПФ (нюансы)
Спасибо большое!
Начинаю думать, что у меня система и правда имеет комплексные коэффициенты. Тут я пока не могу делать выводы.
Сделал тестовый расчет на простом фильтре с реально действительными коэффициентами. (см.картинку) В принципе там все подписано. Вопрос левом столбике:
- первый график - все как в аптеке
- второй - просто для сравнения сделал фильтрацию функцией filter
- третий - ОТКУДА МНИМАЯ СОСТАВЛЯЮЩАЯ? Что не так делаю? Спектры правильные (справа)?
PS: Можете ещё прокомментировать про переходный процесс в начале (обведено), почему в одном случае есть, в другом нет. Я на ощупь то понимаю, что так и должно быть, но вот умных слов бы бы услышать - чего как и откуда - очень помогло бы.
Заранее благодарен. С уважением, Анатолий.
Полноэкранная картинка

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

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

ОБПФ
БПФ
Проанализировал свой спектр, он такой: справа как бы на 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
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./
Re: БПФ (нюансы)
В функции GetFFT частотная ось рассчитывается неверно. И две последние строки портят результат.
Это неправильно. Должно быть что-то типа
А эти строки нужно просто удалить:
Код: Выделить всё
FreqList = DiscretteFrequency*transpose(linspace(0,1,NFFT));
Это неправильно. Должно быть что-то типа
Код: Выделить всё
FreqList = DiscretteFrequency*(0:NFFT-1).'/NFFT;
А эти строки нужно просто удалить:
Код: Выделить всё
FreqList = FreqList(1:Count);
Spectrum = Spectrum(1:Count);
С уважением
Александр Сергиенко
Александр Сергиенко
Re: БПФ (нюансы)
Просто супер!!!
ПРЕБОЛЬШОЕ СПАСИБО!!!
PS: А где можно почитать про то какие системы (желательно примерами из физики) когда на выходе получается комплексный сигнал а не вещественный?
PSPS: Еще раз огромное спасибо! Камень с плеч.
ПРЕБОЛЬШОЕ СПАСИБО!!!
PS: А где можно почитать про то какие системы (желательно примерами из физики) когда на выходе получается комплексный сигнал а не вещественный?
PSPS: Еще раз огромное спасибо! Камень с плеч.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./
Re: БПФ (нюансы)
А где можно почитать про то какие системы (желательно примерами из физики) когда на выходе получается комплексный сигнал а не вещественный?
При чем здесь физика? Тут исключительно математика...
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
С уважением
Александр Сергиенко
Александр Сергиенко
Re: БПФ (нюансы)
Спасибо.
Такой тогда вопрос.
1. Есть вещественный сигнал. В БПФ сигнала на частотах от 0 до Fs имеется "зеркальность". (Если использовать ДПФ (не быстрое - обычное), то "зеркальность также имеет место").
2. На выходе реальной схемы тоже вещественный сигнал, это вроде факт. АФЧХ схемы я расчитываю по формуле для этой схемы. По этой формуле я никакую "зеркальность" (с комплексносопряженностью) в АЧХ не получу, т.к. это просто формула передаточной функции.
Как получить реальный сигнал выхода?
Вы говорили, что искусственно "зеркально" достраивать АФЧХ схемы относительно Fs/2 не нужно. А как тогда быть? Что делать чтобы получить реальный сигнал выхода. Причем чтоб после ОБПФ мнимой части в сигнале не было (...e-10).
Или может всетаки т.к. у нас имеется дискретизированность (а как следствие - зеркальность), то может всетаки надо в АФЧХ реальной схемы тоже как-то вводить каким-то образом "зеркальность"? Т.е. "дискретизировать" схему, если можно так вывразиться.
С уважением, Анатолий Бычков.
PS: очень вам благодарен, мало где таких нюансов узнаешь. За неделю узнал очень много интересного.
Такой тогда вопрос.
1. Есть вещественный сигнал. В БПФ сигнала на частотах от 0 до Fs имеется "зеркальность". (Если использовать ДПФ (не быстрое - обычное), то "зеркальность также имеет место").
2. На выходе реальной схемы тоже вещественный сигнал, это вроде факт. АФЧХ схемы я расчитываю по формуле для этой схемы. По этой формуле я никакую "зеркальность" (с комплексносопряженностью) в АЧХ не получу, т.к. это просто формула передаточной функции.
Как получить реальный сигнал выхода?
Вы говорили, что искусственно "зеркально" достраивать АФЧХ схемы относительно Fs/2 не нужно. А как тогда быть? Что делать чтобы получить реальный сигнал выхода. Причем чтоб после ОБПФ мнимой части в сигнале не было (...e-10).
Или может всетаки т.к. у нас имеется дискретизированность (а как следствие - зеркальность), то может всетаки надо в АФЧХ реальной схемы тоже как-то вводить каким-то образом "зеркальность"? Т.е. "дискретизировать" схему, если можно так вывразиться.
С уважением, Анатолий Бычков.
PS: очень вам благодарен, мало где таких нюансов узнаешь. За неделю узнал очень много интересного.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./
Re: БПФ (нюансы)
Все, что нужно - правильно понимать, на каких частотах нужно рассчитывать ЧХ аналоговой цепи.
Пример: пропускание прямоугольного импульса через интегрирующую RC-цепочку.
Пример: пропускание прямоугольного импульса через интегрирующую 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)
С уважением
Александр Сергиенко
Александр Сергиенко
Re: БПФ (нюансы)
Спасибо. Прошу прощения за задержку, нахожуь в командировке.
Т.е. для аналоговой цепи (и не важно цепи или нет, а просто абстрактной системы у которой известно, что выходной сигнал вещественный) нужно афчх строить от -fs/2 до +fs/2 ? И часть спектра входного сигнала для перемножения спектров соответственно надо переносить в область отрицательных частот?
С уважением, Анатолий.
Т.е. для аналоговой цепи (и не важно цепи или нет, а просто абстрактной системы у которой известно, что выходной сигнал вещественный) нужно афчх строить от -fs/2 до +fs/2 ? И часть спектра входного сигнала для перемножения спектров соответственно надо переносить в область отрицательных частот?
С уважением, Анатолий.
С уважением.
/Ни что так не ограничивает фантазию программиста, как компилятор./
/Ни что так не ограничивает фантазию программиста, как компилятор./