|
|
  |
Измерение частоты основной гармоники (50 Гц) с точностью 0.01 Гц |
|
|
|
Nov 12 2015, 05:34
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(thermit @ Nov 11 2015, 23:19)  Это когда Баскакова обратно склеите. В этом топике информации для реализации более, чем достаточно. Странное у вас условие. Если есть знания, то их нужно реализовывать. На память приходит товарищ Перельман и доказательство гипотезы Пуанкаре. Странные люди, эти математики (с хорошим знанием математики, если оно есть, если это не пользователи какого-либо матпакета), нет бы все на благо Родины, а они "я знаю, но не скажу...мне ничего не нужно, я особенный, а вы балбесы еще лет 30 нничего сделать не сможете...".  . Григорий, если это вы, то так нельзя, не допустимо и не позволительно, потомки вам этого не простят. Цитата(Alex11 @ Nov 12 2015, 02:53)  Что-то Вы залезли в такие дебри математики... Вот результаты моделирования. 3200 Гц дискретизации 1024 точки Фурье, окно Гаусса. При отсутствии шума во входном сигнале точность лучше 6 знаков после запятой. Далее привожу файлы результатов при 5% белого шума и 10%.
Freq5p.txt ( 5.52 килобайт )
Кол-во скачиваний: 116
Freq10p.txt ( 5.52 килобайт )
Кол-во скачиваний: 70] Результат хороший. Каким методом считали? Эрик Якобсен, или по Гауссу но как-то по своему...? У вас в обоих файлах входной сигнал задается через каждые 0,10 Гц, а хотелось бы увидеть через 0,01 Гц. Требуется же разрешение показометра 0,01 Гц и ошибку для такой сетки частот. Если *.txt файл будет большой, то открою с помощью notepad++. Вот уже несколько пользователей писали про сигнал с подмешанным шумом в процентах от сигнала. Вы создаете такое сигнал, наверное, в матлабе, а вот как мне оценить уровень шума в моей системе? Я могу лишь на частоте дискретизации взять выборки АЦП. Вот что получится. Какой здесь уровень шума, кто-нибудь может ответить. Все сигналы отображаются в отсчетах АЦП. При отсутствии сигнала, например, для 16-ти разрядного АЦП (-32768...32767) в канале Ic амплитудное значение с выхода АЦП равно от -4 до 1 (это шум системы). Сколько процентов равен шум в моем случае? Какое отношение сигнал/шум возможно при амплитуде сигнала 1000 разрядов АЦП и этом шуме?
Сообщение отредактировал Pridnya - Nov 12 2015, 05:50
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 12 2015, 07:12
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(Ruslan1 @ Nov 12 2015, 09:12)  Мне кажется, что тема довольно неплохо была раскрыта вот тут: http://electronix.ru/forum/index.php?showtopic=84446По крайней мере, можно использовать как стартовую точку. Ну и моделирование. Матлаб- "наше все". Тогда, учитывая, что вы "там" увидели раскрытие темы и пока не забыли, подсобите простым крестьянам, где там "ключ" и как им воспользоваться? И еще интересует, где начинается "стартовая точка", т.е. откуда начинать. На одном языке разговариваем, а дело сделать не можем. Кто-то утверждает, что уже все сделал, но в матлабе. Ну не генерит же матлаб Си-шный код для Cortex M4F. А без матлаба мы никак, во какая зависимость. PS: Так мы до профтехучилищ дойдем: специальность "оператор ЭВМ", специализация "пользователь матлаб".
Сообщение отредактировал Pridnya - Nov 12 2015, 07:17
|
|
|
|
|
Nov 12 2015, 08:08
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(Pridnya @ Nov 12 2015, 09:12)  Тогда, учитывая, что вы "там" увидели раскрытие темы и пока не забыли, подсобите простым крестьянам, где там "ключ" и как им воспользоваться? И еще интересует, где начинается "стартовая точка", т.е. откуда начинать. На одном языке разговариваем, а дело сделать не можем. Кто-то утверждает, что уже все сделал, но в матлабе. Ну не генерит же матлаб Си-шный код для Cortex M4F. А без матлаба мы никак, во какая зависимость. PS: Так мы до профтехучилищ дойдем: специальность "оператор ЭВМ", специализация "пользователь матлаб".  Ну, мне "там" помогли. В процессе "раскрытия" я освоил Матлаб, изучил его язык, сделал матмодель, проверил ее на реальных данных (залитых в компьютер с помощью того же Матлаба), соорудил си-программу (FFT использовал готовый, но без закрытых либ- все на чистом стандартном си), протестировал в С++Билдере, перевел на мое тогдашнее железо (PIC32), проверил в симуляторе на подсунутых известных данных, проверил в отладчике от генератора, проверил от реального датчика. Уф!  Шаг за шагом. Коротко по методу: FFT (у меня-4096 точек), окно(у меня-Гаусс), интерполяция (у меня-квадратичная интерполяция по трём точкам). Но чудес не бывает, нужно хоть немного понимать что делаете и что от чего и как зависит, иначе результат случаен. А для этого нужно немного теорию почитать и много моделировать (в матлабе). А кортекс у Вас или мипс или еще что- это безразлично, ничего специализированного в общем случае и не нужно для решения задачи (у меня, например, чистый Си на выходе- без проблем таскал внутри Майкрочипов от pic18 до pic32). Вот когда получилось достигнуть нужных параметров по точности и разрешению- тогда можно и про оптимизацию подумать для ускорения, с привязкой к конкретному ядру и предскомпилированным чужим библиотекам.
|
|
|
|
|
Nov 12 2015, 08:11
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Pridnya @ Nov 12 2015, 10:12)  Кто-то утверждает, что уже все сделал, но в матлабе. Вы тут уже утомили всех своими претензиями.. Вот этот код в 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]'); Ошибка измерения: [attachment=96658:FreqEst.jpg]
|
|
|
|
|
Nov 12 2015, 09:19
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(Ruslan1 @ Nov 12 2015, 11:08)  Ну, мне "там" помогли... Спасибо! Цитата(blackfin @ Nov 12 2015, 11:11)  Вы тут уже утомили всех своими претензиями.. Вот этот код в MATLAB'e дает ошибку меньше чем 10 -3: Какие могут быть претензии, это от беспомощности.  А теперь по делу: из вашего кода мне понятно (я вообще этого языка не знаю, придется, наверное, учить), что вы в цикле: создаете сигнал с нужными мне параметрами, умножаете выборку на окно Гаусса, вычисляете БПФ, находите центр и два соседних бина, по формуле считаете частоту, считаете ошибку. Это как раз то, что мне нужно. Совсем другое дело!  Остается перенести на Си и добиться аналогичного результата! Спасибо!  Вообще, лучшие импортные приборы измеряют частоту основной гармоники как раз до 0,001 Гц, показометр так у них показывает. Цитата(blackfin @ Nov 12 2015, 11:11)  Вот этот код в MATLAB'e дает ошибку меньше чем 10-3 [Hz]:
Ошибка измерения: [attachment=96658:FreqEst.jpg] Круто! Этот код в седьмом работает и такую же картинку выдал (ошибку). Значит это готовая модель.
Сообщение отредактировал Pridnya - Nov 12 2015, 08:48
|
|
|
|
|
Nov 12 2015, 17:41
|
Гуру
     
Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965

|
Цитата Вот уже несколько пользователей писали про сигнал с подмешанным шумом в процентах от сигнала. Вы создаете такое сигнал, наверное, в матлабе, а вот как мне оценить уровень шума в моей системе? Я могу лишь на частоте дискретизации взять выборки АЦП. Вот что получится. Какой здесь уровень шума, кто-нибудь может ответить. У меня программа на С, сигнал на входе 1, я подмешиваю просто RND, деленный на фиксированный коэффициент. В примерах выше на 20 и 10, соответственно. Это означает, что максимальное отклонение будет +-0.05 или +-0.025. Среднеквадратичное меньше, какое именно - считать надо. Для шага 0.01 посчитаю вечером, кода домой доберусь. При отсутствии шума все будет хорошо, там нули до 6 знака после запятой. Какой шум Вам добавить, чтобы было похоже на Ваш реальный? И я еще попробую ввести Вашу дискретность на 1024 отсчета, посмотрим как отразится на результате. Сейчас-то синус на входе точный.
|
|
|
|
|
Nov 12 2015, 18:36
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(Alex11 @ Nov 12 2015, 20:41)  У меня программа на С, сигнал на входе 1, я подмешиваю просто RND, деленный на фиксированный коэффициент. В примерах выше на 20 и 10, соответственно. Это означает, что максимальное отклонение будет +-0.05 или +-0.025. Среднеквадратичное меньше, какое именно - считать надо. Для шага 0.01 посчитаю вечером, кода домой доберусь. При отсутствии шума все будет хорошо, там нули до 6 знака после запятой. Какой шум Вам добавить, чтобы было похоже на Ваш реальный? И я еще попробую ввести Вашу дискретность на 1024 отсчета, посмотрим как отразится на результате. Сейчас-то синус на входе точный. Если получится, то попробуйте добавить шум +/- 2 разряда 16-ти разрядного АЦП (диапазон преобразования -32768...+32767), как на скриншоте сигнал Ic из этого поста. И не стесняйтесь показывать свои знания. Проблем с добавлением моей дискретности у вас не должно возникнуть, просто берете 1024 точки через интервал 1/3200 секунды, или вообще абстрагируетесь от времени.
|
|
|
|
|
Nov 12 2015, 21:50
|
Гуру
     
Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965

|
Вот и результаты. Здесь амплитуда сигнала +-32768 и точность входного сигнала ограничена целым. Плюс шум со среднеквадратичным значением 1.7:
FreqN.txt ( 55.24 килобайт )
Кол-во скачиваний: 91Здесь амплитуда +-1000 плюс тот же шум:
Freq1000N.txt ( 55.26 килобайт )
Кол-во скачиваний: 81Даже при небольшой амплитуде точность расчетов превосходит требуемую на полтора порядка. Цитата И не стесняйтесь показывать свои знания. В моем возрасте я уже абсолютно точно знаю, что умею хорошо, что плохо и в чем мне вломину разбираться.
|
|
|
|
|
Jun 15 2017, 08:26
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Здравствуйте! Вопрос очень похожий, задам тут же.
Изменились частоты и семплы, но цель такая же- как можно точнее считать частоту (точнее, чем бины FFT) что не так как раньше: 1) Исходные данные поступают в 5 (или 10) раз чаще, чем нужно для FFT 2) нужно применить окно Ханна: 0.5-0.5*cos(2pi*n/N)
вопрос: при таком окне можно ли применить интерполяцию для уточнения частоты по вычисленному FFT? и какую? До этого при использовании окна Гаусса применял квадратичную интерполяцию, и все отлично было. Можно ли с Ханном ту же квадратичную интерполяцию применить?
И влияет ли метод децимации на качество результата финальной интерполяции в области максимального бина? Что лучше применить для децимации с фактором 5 или 10? простое среднее, IIR, FIR ?
Дальше, подозреваю, у меня появится вопрос про "оптимальную децимацию массива итоговых спектров Фурье", но пока что первый уровень игры пройти нужно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|