Перейти к содержанию
    

Измерение частоты основной гармоники (50 Гц) с точностью 0.01 Гц

Код сишный? Я бы хотел проверить его в работе (программно и/или в железе, лучше в железе). Варианта два: в виде EXE-шника или в виде *.lib библиотеки для STM32F407, это если хотите сохранить код закрытым.

 

Это когда Баскакова обратно склеите. В этом топике информации для реализации более, чем достаточно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то Вы залезли в такие дебри математики... Вот результаты моделирования. 3200 Гц дискретизации 1024 точки Фурье, окно Гаусса. При отсутствии шума во входном сигнале точность лучше 6 знаков после запятой. Далее привожу файлы результатов при 5% белого шума и 10%.

Freq5p.txt

Freq10p.txt

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это когда Баскакова обратно склеите. В этом топике информации для реализации более, чем достаточно.

Странное у вас условие. Если есть знания, то их нужно реализовывать. На память приходит товарищ Перельман и доказательство гипотезы Пуанкаре.

Странные люди, эти математики (с хорошим знанием математики, если оно есть, если это не пользователи какого-либо матпакета), нет бы все на благо Родины, а они "я знаю, но не скажу...мне ничего не нужно, я особенный, а вы балбесы еще лет 30 нничего сделать не сможете...". :rolleyes:. Григорий, если это вы, то так нельзя, не допустимо и не позволительно, потомки вам этого не простят. :biggrin:

 

Что-то Вы залезли в такие дебри математики... Вот результаты моделирования. 3200 Гц дискретизации 1024 точки Фурье, окно Гаусса. При отсутствии шума во входном сигнале точность лучше 6 знаков после запятой. Далее привожу файлы результатов при 5% белого шума и 10%.

Freq5p.txt

Freq10p.txt

]

Результат хороший. Каким методом считали? Эрик Якобсен, или по Гауссу но как-то по своему...?

У вас в обоих файлах входной сигнал задается через каждые 0,10 Гц, а хотелось бы увидеть через 0,01 Гц. Требуется же разрешение показометра 0,01 Гц и ошибку для такой сетки частот. Если *.txt файл будет большой, то открою с помощью notepad++.

 

Вот уже несколько пользователей писали про сигнал с подмешанным шумом в процентах от сигнала. Вы создаете такое сигнал, наверное, в матлабе, а вот как мне оценить уровень шума в моей системе? Я могу лишь на частоте дискретизации взять выборки АЦП. Вот что получится. Какой здесь уровень шума, кто-нибудь может ответить.

 

Все сигналы отображаются в отсчетах АЦП. При отсутствии сигнала, например, для 16-ти разрядного АЦП (-32768...32767) в канале Ic амплитудное значение с выхода АЦП равно от -4 до 1 (это шум системы). Сколько процентов равен шум в моем случае? Какое отношение сигнал/шум возможно при амплитуде сигнала 1000 разрядов АЦП и этом шуме?

post-62159-1447306460_thumb.png

Изменено пользователем Pridnya

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, что тема довольно неплохо была раскрыта вот тут:

http://electronix.ru/forum/index.php?showtopic=84446

По крайней мере, можно использовать как стартовую точку.

 

Ну и моделирование. Матлаб- "наше все".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, что тема довольно неплохо была раскрыта вот тут:

http://electronix.ru/forum/index.php?showtopic=84446

По крайней мере, можно использовать как стартовую точку.

 

Ну и моделирование. Матлаб- "наше все".

Тогда, учитывая, что вы "там" увидели раскрытие темы и пока не забыли, подсобите простым крестьянам, где там "ключ" и как им воспользоваться? И еще интересует, где начинается "стартовая точка", т.е. откуда начинать. На одном языке разговариваем, а дело сделать не можем. Кто-то утверждает, что уже все сделал, но в матлабе. Ну не генерит же матлаб Си-шный код для Cortex M4F. А без матлаба мы никак, во какая зависимость. :rolleyes:

 

PS: Так мы до профтехучилищ дойдем: специальность "оператор ЭВМ", специализация "пользователь матлаб". :biggrin:

Изменено пользователем Pridnya

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну не генерит же матлаб Си-шный код для Cortex M4F. А без матлаба мы никак, во какая зависимость.

Почему это не генерирует? Еще как. И не один год уже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда, учитывая, что вы "там" увидели раскрытие темы и пока не забыли, подсобите простым крестьянам, где там "ключ" и как им воспользоваться? И еще интересует, где начинается "стартовая точка", т.е. откуда начинать. На одном языке разговариваем, а дело сделать не можем. Кто-то утверждает, что уже все сделал, но в матлабе. Ну не генерит же матлаб Си-шный код для Cortex M4F. А без матлаба мы никак, во какая зависимость. :rolleyes:

 

PS: Так мы до профтехучилищ дойдем: специальность "оператор ЭВМ", специализация "пользователь матлаб". :biggrin:

Ну, мне "там" помогли. В процессе "раскрытия" я освоил Матлаб, изучил его язык, сделал матмодель, проверил ее на реальных данных (залитых в компьютер с помощью того же Матлаба), соорудил си-программу (FFT использовал готовый, но без закрытых либ- все на чистом стандартном си), протестировал в С++Билдере, перевел на мое тогдашнее железо (PIC32), проверил в симуляторе на подсунутых известных данных, проверил в отладчике от генератора, проверил от реального датчика. Уф! :) Шаг за шагом.

 

Коротко по методу: FFT (у меня-4096 точек), окно(у меня-Гаусс), интерполяция (у меня-квадратичная интерполяция по трём точкам).

Но чудес не бывает, нужно хоть немного понимать что делаете и что от чего и как зависит, иначе результат случаен. А для этого нужно немного теорию почитать и много моделировать (в матлабе).

 

А кортекс у Вас или мипс или еще что- это безразлично, ничего специализированного в общем случае и не нужно для решения задачи (у меня, например, чистый Си на выходе- без проблем таскал внутри Майкрочипов от pic18 до pic32).

Вот когда получилось достигнуть нужных параметров по точности и разрешению- тогда можно и про оптимизацию подумать для ускорения, с привязкой к конкретному ядру и предскомпилированным чужим библиотекам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-то утверждает, что уже все сделал, но в матлабе.

Вы тут уже утомили всех своими претензиями.. :biggrin:

 

Вот этот код в MATLAB'e дает ошибку меньше чем 10-3 [Hz]:

N  = 1024;                    % Total Samples
Fd = 3200;                    % Sampling Frequency [Hz]
dT = 1/Fd;                    % Time Step [S]
dF = Fd/N;                    % Freq Step [Hz]
Zs = 4;                       % Zero Fill N*(Zs-1) Samples (Zs = 2^M, ie, Zs = 1,2,4,8,16..)
t = 0:dT:dT*(N-1);
f = 0:dF:dF*(N*Zs-1);
for n = 1:1000
Fsrc = 45.0+0.01*n;           % Frequency of Source [Hz]
Psrc = pi/3+(pi/3000)*n;      % Phase of Source [Rad]
St = sin(2*pi*Fsrc*t+Psrc);   % S(t) - Source Signal
Tg = 0.04;                    % Width of Window [S]
Wg = exp(-(t-dT*N/2).^2/Tg^2);
Ws = Wg.*St;
Sf = fft(Ws,N*Zs);
Sa = abs(Sf);
[M,I] = max(Sa);
S1 = Sa(I-1);
S2 = Sa(I);
S3 = Sa(I+1);
Freq = (dF*(I-1)+0.5*dF*(S3-S1)/(2*S2-S3-S1))/Zs;
Ferr(n) = abs(Fsrc-Freq);
Ftst(n) = Fsrc;
end;
plot(Ftst,Ferr);
grid on
xlabel('Frequency [Hz]')
ylabel('Error')
legend('Frequency Error [Hz]');

 

Ошибка измерения:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот этот код в MATLAB'e дает ошибку меньше чем 10-3:

.....

Эх, а я к этому результату медленно полз.....

Что интересно- когда дополз, то нашел в интернете кучу практически готовых ответов на мой вопрос. Но пока не понимал что искать, ответ найти не мог :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, мне "там" помогли...

Спасибо!

 

Вы тут уже утомили всех своими претензиями.. :biggrin:

 

Вот этот код в MATLAB'e дает ошибку меньше чем 10-3:

Какие могут быть претензии, это от беспомощности. :crying:

 

А теперь по делу: из вашего кода мне понятно (я вообще этого языка не знаю, придется, наверное, учить), что вы в цикле:

создаете сигнал с нужными мне параметрами,

умножаете выборку на окно Гаусса,

вычисляете БПФ,

находите центр и два соседних бина,

по формуле считаете частоту,

считаете ошибку.

 

Это как раз то, что мне нужно. Совсем другое дело! :laughing: Остается перенести на Си и добиться аналогичного результата! Спасибо! :rolleyes:

Вообще, лучшие импортные приборы измеряют частоту основной гармоники как раз до 0,001 Гц, показометр так у них показывает.

 

Вот этот код в MATLAB'e дает ошибку меньше чем 10-3 [Hz]:

 

Ошибка измерения:

 

Круто! Этот код в седьмом работает и такую же картинку выдал (ошибку). Значит это готовая модель. :rolleyes:

Изменено пользователем Pridnya

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот уже несколько пользователей писали про сигнал с подмешанным шумом в процентах от сигнала. Вы создаете такое сигнал, наверное, в матлабе, а вот как мне оценить уровень шума в моей системе? Я могу лишь на частоте дискретизации взять выборки АЦП. Вот что получится. Какой здесь уровень шума, кто-нибудь может ответить.

У меня программа на С, сигнал на входе 1, я подмешиваю просто RND, деленный на фиксированный коэффициент. В примерах выше на 20 и 10, соответственно. Это означает, что максимальное отклонение будет +-0.05 или +-0.025. Среднеквадратичное меньше, какое именно - считать надо.

Для шага 0.01 посчитаю вечером, кода домой доберусь. При отсутствии шума все будет хорошо, там нули до 6 знака после запятой. Какой шум Вам добавить, чтобы было похоже на Ваш реальный? И я еще попробую ввести Вашу дискретность на 1024 отсчета, посмотрим как отразится на результате. Сейчас-то синус на входе точный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня программа на С, сигнал на входе 1, я подмешиваю просто RND, деленный на фиксированный коэффициент. В примерах выше на 20 и 10, соответственно. Это означает, что максимальное отклонение будет +-0.05 или +-0.025. Среднеквадратичное меньше, какое именно - считать надо.

Для шага 0.01 посчитаю вечером, кода домой доберусь. При отсутствии шума все будет хорошо, там нули до 6 знака после запятой. Какой шум Вам добавить, чтобы было похоже на Ваш реальный? И я еще попробую ввести Вашу дискретность на 1024 отсчета, посмотрим как отразится на результате. Сейчас-то синус на входе точный.

 

Если получится, то попробуйте добавить шум +/- 2 разряда 16-ти разрядного АЦП (диапазон преобразования -32768...+32767), как на скриншоте сигнал Ic из этого поста. И не стесняйтесь показывать свои знания. :rolleyes:

 

Проблем с добавлением моей дискретности у вас не должно возникнуть, просто берете 1024 точки через интервал 1/3200 секунды, или вообще абстрагируетесь от времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и результаты. Здесь амплитуда сигнала +-32768 и точность входного сигнала ограничена целым. Плюс шум со среднеквадратичным значением 1.7:

FreqN.txt

Здесь амплитуда +-1000 плюс тот же шум:

Freq1000N.txt

Даже при небольшой амплитуде точность расчетов превосходит требуемую на полтора порядка.

И не стесняйтесь показывать свои знания.

В моем возрасте я уже абсолютно точно знаю, что умею хорошо, что плохо и в чем мне вломину разбираться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И что, дальше никому не интересно? Написали бы, чем дело кончилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

Вопрос очень похожий, задам тут же.

 

Изменились частоты и семплы, но цель такая же- как можно точнее считать частоту (точнее, чем бины FFT)

что не так как раньше:

1) Исходные данные поступают в 5 (или 10) раз чаще, чем нужно для FFT

2) нужно применить окно Ханна: 0.5-0.5*cos(2pi*n/N)

 

вопрос: при таком окне можно ли применить интерполяцию для уточнения частоты по вычисленному FFT? и какую?

До этого при использовании окна Гаусса применял квадратичную интерполяцию, и все отлично было.

Можно ли с Ханном ту же квадратичную интерполяцию применить?

 

И влияет ли метод децимации на качество результата финальной интерполяции в области максимального бина?

Что лучше применить для децимации с фактором 5 или 10? простое среднее, IIR, FIR ?

 

 

Дальше, подозреваю, у меня появится вопрос про "оптимальную децимацию массива итоговых спектров Фурье", но пока что первый уровень игры пройти нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...