Тут все достаточно просто. Допустим есть исходный сигнал — пусть прямоугольный. Из него можно выделить первую гармонику цифровым фильтром. Затем подобрать параметры получившегося сигнала, минимизируя среднеквадратичное отклонение модельного сигнала (это синус неизвестной частоты, амплитуды и фазы) от имеющегося. Этот метод не универсален — требуется знать тип сигнала. Есть и другие недостатки, например, точность сильно зависит от того, насколько хорош оптимизатор. Требуется найти глобальный минимум, но, к сожалению, можно попасть и в локальный…
Измерение частоты так или иначе происходит через сравнение с эталонным источником. Есть специальные компараторы частот.
Тут еще возникает вопрос о стабильности приемника, который применял Автор текущей статьи. Есть ли в нем гетеродин? Если да, то точность будет напрямую зависеть от стабильности гетеродина.
То есть время измерения классическим способом подсчета составит от 2x1000 секунд. Уйдет в районе получаса на одно измерение.
ну давайте, чтобы не быть голословными, проведем маленький эксперимент:)
посмотрим какую точность сможем достичь, если продискретизируем сигнал с частой 10,12345 кГц.
пусть частота дискретизации 44100 Гц. сигнал на входе звуковой карты после делителя почти прямоугольный:
N = 100000
f0 = 1.000012345e4
fd = 44100.0
a_sig = np.sin(2.0*np.pi*f0/fd*np.arange(N)+0.01)
d_sig = np.array([1.0 if x > 0 else 0.0 for x in a_sig])
d_sig += np.random.normal(0.0, 0.1, size=len(d_sig))
f_sig = butter_bandpass_filter(d_sig, 1e4, 1.5e4, fd)[20:]
у меня сигнал на входе карты это d_sig. насыпим к нему шума. профильтруем его — сделаем из прямоугольника синус. и попытаемся пофитить. весь код целиком:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import differential_evolution
from scipy.signal import butter, lfilter
def butter_bandpass(lowcut, highcut, fs, order=6):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs, order=6):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = lfilter(b, a, data)
return y
def sig_estim(x, *args):
A = x[0]
f = x[1]
phi = x[2]
sig_len = len(args[0])
sig = np.sin(2.0*np.pi*f*np.arange(sig_len)+phi)
return np.sum((sig - args[0])**2)
N = 100000
f0 = 1.000012345e4
fd = 44100.0
a_sig = np.sin(2.0*np.pi*f0/fd*np.arange(N)+0.01)
d_sig = np.array([1.0 if x > 0 else 0.0 for x in a_sig])
d_sig += np.random.normal(0.0, 0.1, size=len(d_sig))
f_sig = butter_bandpass_filter(d_sig, 1e4, 1.5e4, fd)[20:]
bounds = [(0.1, 1.0), (1e4/fd, 1.5e4/fd), (-3.14, 3.14)]
result = differential_evolution(sig_estim, bounds, args = (f_sig,))
print(result.x, result.fun)
print(result.x[1]*fd)
в результате получим 10000.122856650896
итого 7 знаков правильно определили. и это за выборку в несколько секунд
там стоит точно такой же кварц. у txc серии стабильност на уровне дестятка ppm.
а вот, к сожалению, не во всех спектроанализаторах стоят хорошие опорники.
а если бОльшая точность нужна, то в любительских условях можно сверять частоту по GPS-приемнику (считай квантовый эталон).
А на последнем графике зависимость ошибки от времени для тренировочного множества?
если да, то какая ошибка на тестовой выборке?
скажем, если на тренировочную выборку чуть-чуть нашуметь, будет ли сеть достоверно воспроизводить модель? как мне кажется, с шумом все достоинства вторых производных сойдут на нет.
а там есть фото с ч/б телевизором, и, увы… изображение на нем черно-белое.
имхо, лапша это. скорее всего пейзажи, где ясно — где трава, где небо, будут нормально раскрашиваться, а вот участки (одежда и пр.), где средняя интенсивность меняется слабо будет работать плохо. оно и ясно — по интенсивности (одно значение) невозможно восстановить цвет (три значения).
Мне просто интересна крутизна преобразования. Т.е преобразование удлинения плеча в Вольты (в конце концов там фотодиод же стоит и напряжение с него снимают?).
Интереснее всего, как они стабилизируют амплитуду излучения (а там на минутку, киловатты), чтобы изменение давления излучения на зеркала не влияла на точность в 26-ом знаке. И еще. А с какой точностью надо фазу мерить?
Измерение частоты так или иначе происходит через сравнение с эталонным источником. Есть специальные компараторы частот.
Тут еще возникает вопрос о стабильности приемника, который применял Автор текущей статьи. Есть ли в нем гетеродин? Если да, то точность будет напрямую зависеть от стабильности гетеродина.
ну давайте, чтобы не быть голословными, проведем маленький эксперимент:)
посмотрим какую точность сможем достичь, если продискретизируем сигнал с частой 10,12345 кГц.
пусть частота дискретизации 44100 Гц. сигнал на входе звуковой карты после делителя почти прямоугольный:
у меня сигнал на входе карты это d_sig. насыпим к нему шума. профильтруем его — сделаем из прямоугольника синус. и попытаемся пофитить. весь код целиком:
в результате получим 10000.122856650896
итого 7 знаков правильно определили. и это за выборку в несколько секунд
а вот, к сожалению, не во всех спектроанализаторах стоят хорошие опорники.
а если бОльшая точность нужна, то в любительских условях можно сверять частоту по GPS-приемнику (считай квантовый эталон).
если да, то какая ошибка на тестовой выборке?
скажем, если на тренировочную выборку чуть-чуть нашуметь, будет ли сеть достоверно воспроизводить модель? как мне кажется, с шумом все достоинства вторых производных сойдут на нет.
пысы: для улья надо не Wi-Fi, а zigbee :)
можете пояснить? не совсем понятно.
зы, Вы там только аккуратнее!
имхо, лапша это. скорее всего пейзажи, где ясно — где трава, где небо, будут нормально раскрашиваться, а вот участки (одежда и пр.), где средняя интенсивность меняется слабо будет работать плохо. оно и ясно — по интенсивности (одно значение) невозможно восстановить цвет (три значения).