| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Изменение фазы сигнала. |
| Автор: ivan219 12.11.2008, 16:56 |
| Собственно вопрос вот в чём уменя есть два сигнала полученых с LinIn разность фаз которых равно 90 градусов но на самом деле там не совсем 90 вот надо както компенсировать это отклонение от 90 градусов. Как это сделать |
| Автор: Alexeis 13.11.2008, 10:33 |
| В продолжении темы про фурье, комплексный спеткр можно представить в тригонометрической форме R(n) * e^(i * FI(n)) . Rn - длинна вектора имеющего начало в начале системы координат и концом в точке на комплексной плоскости с координатами (Re(n), Im(n)) для n-й частоты, FI(n) - угол вектора относительно оси Х. Форму R(n) * e^(i * FI(n)) получается из R(n)*(Cos(FI) + i*Sin(FI)). Соответственно после перевода в тригонометрический вид нужно к углу F(n) добавить 90 градусов, тогда получим для m й частоты (2й частоты) R(m)*(Cos(FI(n) + 90) + i*Sin(FI(n) + 90)), преобразуя к алгебраическому виду имеем Re(m) = R(m)*Cos(FI(n) + 90); Im(m) = R(m)*Sin(FI(n) + 90); Дальше если еще вспомнить тригонометрию, то Cos(FI(n) + 90) = - Sin(FI(n)), а Sin(FI(n) + 90) = Cos(FI(n)), в результате Re(m) = - R(m)*Sin(FI(n)); Im(m) = R(m)*Cos(FI(n)); Напомню еще что R(m) вычисляется как Sqrt(Re(m)^2 + Im(m)^2), а FI(n) = arctTg(Im(n) / Re(n)); Итого окончательно имеем новые Re` и Im` Re`(m) = - Sqrt(Re(m)^2 + Im(m)^2) * Sin(arctTg(Im(n) / Re(n))); Im`(m) = Sqrt(Re(m)^2 + Im(m)^2) * Cos(arctTg(Im(n) / Re(n))); Далее исправленные значения комплексного спектра записываем на место старых и делаем обратное преобразование фурье, в результате волны должны сместиться так что угол будет составлять 90 градусов. |
| Автор: ivan219 13.11.2008, 15:12 | ||
| Спасибо. Но немного не то что я хотел. Мне надо чтобы после фильтрации вот тут DuolChanal[I * 2] было по фазе 0 а здесь DuolChanal[I * 2 + 1] должно быть 90 на самом деле в нём после генератора 89 это для примера а надо сделать 90
|
| Автор: Alexeis 13.11.2008, 15:19 |
| Тогда еще проще, просто вычислить амплитуду, подставить свою фазу и обратным фурье получить нужный сигнал. |
| Автор: ivan219 13.11.2008, 15:28 |
| Автор: ivan219 13.11.2008, 15:50 |
| Alexeis, и ещё тут Re(m) = R(m)*Cos(FI(n) + 90); Im(m) = R(m)*Sin(FI(n) + 90); вот эти m и n их значение одинаково или нет. Если я правильно понял то должно быть так: Re(1) = R(1) * Cos(FI(1) + 90); Im(1) = R(1) * Sin(FI(1) + 90); Да??? |
| Автор: Alexeis 13.11.2008, 17:44 |
| Гмм... чет я ничего не понял. Фаза 90 градусов относительно чего? |
| Автор: Alexeis 13.11.2008, 20:56 | ||
Воот, тогда то что я написал в начале как раз то что нужно |
| Автор: ivan219 14.11.2008, 16:09 | ||
Не совсем надо в нести некоторую по правку, унас 2 вектра крутятся и если все числа исправить так: Re(m) = R(m)*Cos(FI(n) + Fi'); Im(m) = R(m)*Sin(FI(n) + Fi'); То получаем искажение. Надо для положительной частоты делать так: Re(m) = R(m)*Cos(FI(n) - Fi'); Im(m) = R(m)*Sin(FI(n) - Fi'); А для отрицательной: Re(m) = R(m)*Cos(FI(n) + Fi'); Im(m) = R(m)*Sin(FI(n) + Fi'); И того имеем:
единственно что плохо так это что нужно делать прямое и обратное БПФ второго сигнала для исправления амплитуды и фазы, а потом уже общее БПФ для двух. Какбы это обойти? Чтобы при основном БПФ происходила компенсация фазы и амплитыды. |
| Автор: Alexeis 14.11.2008, 16:36 | ||
Это еще зачем? Если сделаешь общее БПФ, то на нем можно отдельно работать с каждой из составляющих спектра и менять фазу независимо для каждой волны. |
| Автор: ivan219 30.11.2008, 15:08 |
| Финал. Не всё оказалось так просто!!! В архиве пример может кому пригодится. |