Пожалуйста, прости меня, если установка слишком длинная, но меня часто просят дать больше контекста относительно того, что я пытаюсь сделать, когда я публикую что-то здесь.
В качестве упражнения я Я пытаюсь определить значения Rs и Ls, которые были использованы в цепи, из измерений Vin, Vout и опережающего / запаздывания фазы между ними. Я смоделировал схему, используя конкретное значение c для Rs и Ls. , а затем попытайтесь определить, какие эти значения были получены из измеренных данных. Пример схемы показан ниже, а также формы сигналов, полученные из него.
LTSpice не производит выборку с одинаковыми интервалами, поэтому хитрость для восстановления данных с равномерной выборкой состоит в том, чтобы взять БПФ сигналов, а затем взять другое БПФ сигналов БПФ для восстановления данных временной области, теперь с равномерная выборка (LTSpice выполняет интерполяцию для FFT). Я делаю это, а затем экспортирую эти данные в сценарий Python, где я пытаюсь определить амплитуды Vo и Vi и фазовую задержку ,, между ними, а затем используйте эти значения для идентификации Rs и Ls по следующим формулам:
С ,
затем , где V1 и Vo - амплитуды синусоид, а
Поэтому, исходя из величины и фазы Z, я могу определить значения R и L:
С
затем
.
Проблема в том, что я получаю неправильный ответ, в основном из-за ошибки в вычислении фазовой задержки. Когда я определяю фазовую задержку с использованием курсоров на сигналах LTSpice или путем усреднения времени между пиками vi и vo (также находящимися программно) по многим периодам, я приближаюсь, но с большой ошибкой в значении R. Итак, мне пришло в голову, что лучше использовать круговую взаимную корреляцию, но это тоже не работает - и я не знаю почему.
Когда я нахожу пики и временную задержку без cxcorr, вот что я получаю:
Когда я использую круговую кросскорреляцию
from numpy.fft import fft, ifft
def periodic_corr(x, y):
"""Periodic correlation, implemented using the FFT.
x and y must be real sequences with the same length.
"""
return ifft(fft(x).conj() * fft(y)).real
xcorr=periodic_corr(vi,vo)
dly= np.argmax(xcorr)
print(dly)
plt.plot(time,vo,time+261241*deltaT,vi)
индекс максимальной корреляции возникает после 261241 смен, или ~ 30use c, что является практически последним смещенным положением, показанным ниже (deltaT = 1.1444091796875e-10):
Итак, я не знаю, что я делаю не так. Я подумал, что это будет легко, поскольку данные, над которыми я работаю, моделируются и не имеют шума. Я должен быть в состоянии получить точные Rs и Ls, но есть кое-что, что я определенно делаю неправильно с xcorr, и я не должен быть достаточно точным, когда я нахожу пики и измеряю задержку для выполнения идентификации. Два метода, ни один из них не дает мне правильного ответа ...
Я могу поделиться данными, кодом python и т. Д. c, если кто-то заинтересован помочь выяснить, почему это, казалось бы, простое упражнение не является работает на меня.
Спасибо. Я отредактирую вопрос, когда у меня будет время, чтобы сделать его более кратким и конкретным.