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

минимизация погрешности

А зачем в таком случае БПФ?

Тут наверное что-то следящее больше подходит, типа цифровой ФАПЧ.

 

...цифровой ФАПЧ? нужно программное решение...

 

Дык ведь, если доступен поток данных непрерывный. то и делаем интерполяционный фильтр с какой надо точностью (то есть, с необходимым нам увеличением частоты отсчетов, а потом анализируем. Проблем то нет. Лучше, все равно, не получится. Самое прямое и понятное решение. После интерполяции размер БПФ увеличенный берем, опять, такой какой нам нужен для точности.

 

можно подробнее про этот подход...

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

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


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

...цифровой ФАПЧ? нужно программное решение...

 

 

 

можно подробнее про этот подход...

На пальцах так.

Предположим (для упрощения) что достаточно увеличить число точек в 10 раз.

Делаем интерполяцию любым доступным инструментом (Matlab, Excel, ..).

Для этого добавляем по 9 нулей между каждым отсчетом и "получаем частоту дискретизации" 12000 Hz.

Пропускаем этот "поток" через цифровой фильтр нижних частот (интерполяционный фильтр), задача которого - обязательно пропускать первую гармонику (50 Hz), но достаточно хорошо () подавлять все частоты выше 600 Гц. Можно взять для пробы затухание 40-60 дБ, а там видно будет. Нужно брать FIR, так как он не трогает фазы.

Выходной сигнал будет иметь в 10 раз больше точек, что позволит повысить "точность".

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

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


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

...цифровой ФАПЧ? нужно программное решение...

Так это и есть программное решение.

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


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

На пальцах так.

Предположим (для упрощения) что достаточно увеличить число точек в 10 раз.

Делаем интерполяцию любым доступным инструментом (Matlab, Excel, ..).

Для этого добавляем по 9 нулей между каждым отсчетом и "получаем частоту дискретизации" 12000 Hz.

Пропускаем этот "поток" через цифровой фильтр нижних частот (интерполяционный фильтр), задача которого - обязательно пропускать первую гармонику (50 Hz), но достаточно хорошо () подавлять все частоты выше 600 Гц. Можно взять для пробы затухание 40-60 дБ, а там видно будет. Нужно брать FIR, так как он не трогает фазы.

Выходной сигнал будет иметь в 10 раз больше точек, что позволит повысить "точность".

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

... не совсем понимаю, что даёт интерполяция сама по себе. Пусть даже интерполировал не нулями, а вычисленными значениями (пусть интерполяция сплайнами).

Получил 24 выборки (анализ в течении 0.02с) -> Интерполировал, получил 240 точек на период -> провёл fft...

получил спектр, стало видно, что на погрешность это не влияет(((...

как стало видно увеличение числа точек даёт увеличение полосы спектра, но спектральные отчёты продолжают итди с тем же интервалом...

 

другое дело - это когда увеличиваем интервал анализа( скажем берём не один "период" (0,02с), а пусть 20 (0.4)), то тут спектральные составляющие идут уже с частотой 2.5 Гц (1/T), а не 50Гц.

Но проблема заключается в том, что нужно получать данные о БПФ каждые 20мс(стало быть по данным одного периода) и получается что априори имеем дело с 24 выборками((...

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

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


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

... не совсем понимаю, что даёт интерполяция сама по себе. Пусть даже интерполировал не нулями, а вычисленными значениями (пусть интерполяция сплайнами).

Получил 24 выборки (анализ в течении 0.02с) -> Интерполировал, получил 240 точек на период -> провёл fft...

получил спектр, стало видно, что на погрешность это не влияет(((...

как стало видно увеличение числа точек даёт увеличение полосы спектра, но спектральные отчёты продолжают итди с тем же интервалом...

 

другое дело - это когда увеличиваем интервал анализа( скажем берём не один "период" (0,02с), а пусть 20 (0.4)), то тут спектральные составляющие идут уже с частотой 2.5 Гц (1/T), а не 50Гц.

Но проблема заключается в том, что нужно получать данные о БПФ каждые 20мс(стало быть по данным одного периода) и получается что априори имеем дело с 24 выборками((...

делайте обработку с перекрытием вычисляйте каждые 20 мс БПФ на интервале 0.4 секунды. Вот пример матлабовский:

clear all; clc;
fs = 1200;  %частота дискретизации
N = 1000;   % обработка в течении 1000 отсчетов
L = 64;     % окно анализа 64 отсчета
t = (0:N-1)/fs; %время
K = 24; %смещаем окно анализа на 24 отсчета
X =1;   % начальное смещение
i =1;   % номер итерации
f = 50+(rand(1,1)-0.5*10); %случайная частота 50+-5 Гц

% сигнал с небольшим гулянием амплитуды
s0 = 1.4*sin(2*pi*f*t).*(1+0.5*cos(0.5*pi*t+rand(1,1)*2*pi));
%цикл анализа
while((X+L)<N) % пока есть отсчеты для анализа
   
    s = s0(X:X+L-1);    %выбираю превое окно длины L = 64 отсчета
    w = window(@flattopwin ,L)'; % максимально плоское весовое окно чтобы получить максимально-точную оценку амплитуды
    S = abs(fft(s.*w))/(sum(w)); % БПФ   
    A(i) = max(S);  % амплитуда в данном окне такая вот
    T(i) = (X+L/2)/fs; %первое окно с задержкой 64 отсчета
    i =i+1; % инкремент номера цикла анализа
    X=X+K;% смещаю окно на 20 мс теперь будет без задержек
end;
plot(t,s0,T,A*2,'r.-'),grid; % синим сигнал, красным его амплитуда. точки оценки амплитуды идут через 20 мс.

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


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

... не совсем понимаю, что даёт интерполяция сама по себе ...

С помощью интерполяции (добавление нулей и фильтрация) мы получаем дополнительные точки для решения задачи во временной области. Очень важна фильтрация, которая позволяет убрать весь шум выше искомой частоты и точно расставить интерполяционные точки. Как вариант, фильтр должен делать свертку фрагмента выборки с добавленными нулями с импульсной характеристикой фильтра на каждый сдвиг, то есть с увеличенной Fs. Размер фильтра, как предлагал bahurin, может быть больше выборки. Допустим, коэффициент интерполяции равен 10, тогда точек в выборке будет 24х10=240. Размер фильтра может быть и больше, что желательно для лучшего подавления частот выше первой гармоники (то есть, можно подавлять со 100 Гц). Кстати, фильтр лучше сделать и до интерполяции, так как 24 точек хватит, тем более, что импульсную характеристику лучше взять длиннее. Еще раз, интерполяция нужна для решения задачи во временной области.

Насчет FFT на каждые 24 точки - это ведь не означает, что поток точек прерывистый. Применение FFT на 24 или на большее число точек нужно делать скользящим, т.е каждый раз со сдвигом на каждую точку (в 24 раза больше). После этого можно провести дополнительную обработку с целью получить пользу из этой избыточности.

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

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

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


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

... не совсем понимаю, что даёт интерполяция сама по себе ...

С помощью интерполяции (добавление нулей и фильтрация) мы получаем дополнительные точки для решения задачи во временной области. Очень важна фильтрация, которая позволяет убрать весь шум выше искомой частоты и точно расставить интерполяционные точки. Как вариант, фильтр должен делать свертку фрагмента выборки с добавленными нулями с импульсной характеристикой фильтра на каждый сдвиг, то есть с увеличенной Fs. Размер фильтра, как предлагал bahurin, может быть больше выборки. Допустим, коэффициент интерполяции равен 10, тогда точек в выборке будет 24х10=240. Размер фильтра может быть и больше, что желательно для лучшего подавления частот выше первой гармоники (то есть, можно подавлять со 100 Гц). Кстати, фильтр лучше сделать и до интерполяции, так как 24 точек хватит, тем более, что импульсную характеристику лучше взять длиннее. Еще раз, интерполяция нужна для решения задачи во временной области.

Насчет FFT на каждые 24 точки - это ведь не означает, что поток точек прерывистый. Применение FFT на 24 или на большее число точек нужно делать скользящим, т.е каждый раз со сдвигом на каждую точку (в 24 раза больше). После этого можно провести дополнительную обработку с целью получить пользу из этой избыточности.

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

... зачем нулями-то? Лучше же приближённо реальные точки найти... линейно, или сплайнами...

смоделирую в Матлаба завтра всё то, что вы сказали...

а насчёт выборки... ну вот примерно так в матлаб и задавать нужно

 

f = 50+(rand(1,1)-0.5*10); %случайная частота 50+-5 Гц

s0 = 1.4*sin(2*pi*f*t).*(1+0.5*cos(0.5*pi*t+rand(1,1)*2*pi));% сигнал с небольшим гулянием амплитуды

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

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


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

... зачем нулями-то? Лучше же приближённо реальные точки найти... линейно, или сплайнами...

смоделирую в Матлаба завтра всё то, что вы сказали...

а насчёт выборки... ну вот примерно так в матлаб и задавать нужно

 

f = 50+(rand(1,1)-0.5*10); %случайная частота 50+-5 Гц

s0 = 1.4*sin(2*pi*f*t).*(1+0.5*cos(0.5*pi*t+rand(1,1)*2*pi));% сигнал с небольшим гулянием амплитуды

 

Как раз только НУЛЯМИ - это и есть настоящая интерполяция. Так мы не портим спектр, а только клонироем его на высоких частотах, а потом все эти компоненты ликвидируем фильтрацией (естественно, с приемлемой точностью, определяющейся затуханием интерполяционного фильтра). В результате мы увидим, что число точек во временной области увеличилось в N раз и они расставились после фильтрации именно наилучшим образом. В этом вся суть интерполяции. Ничего не надо делать приближенно, по крайней мере, вначале для получения максимального результата. Только добавление нулей и фильтрация. В Матлабе при просмотре структуры интерполяционного фильтра можно увидеть эти нули.

 

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

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


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

Как раз только НУЛЯМИ - это и есть настоящая интерполяция. Так мы не портим спектр, а только клонироем его на высоких частотах, а потом все эти компоненты ликвидируем фильтрацией (естественно, с приемлемой точностью, определяющейся затуханием интерполяционного фильтра). В результате мы увидим, что число точек во временной области увеличилось в N раз и они расставились после фильтрации именно наилучшим образом. В этом вся суть интерполяции. Ничего не надо делать приближенно, по крайней мере, вначале для получения максимального результата. Только добавление нулей и фильтрация. В Матлабе при просмотре структуры интерполяционного фильтра можно увидеть эти нули.

 

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

 

Вы только что сами все сказали интерполяция просто клонирует спектр. И если по исходному спектру нельзя точно померить, то и по "клонированному" тоже не получится, так как все повторяющиеся куски полностью совпадают с исходным. После фильтрации в идеале опять останется исходный спектр, по которому нельзя точно померить. А поскольку идеального фильтра нет, то вы только уменьшите точность оценки амплитуды. Еще раз повторяю: интерполяция не вносит никакой дополнительной информации, поэтому не может улучшить точности оценки.

 

Что касается фильтрации до интерполяции, то опять таки отсутствие идеального фильтра не полностью подавит высшие гармоники и использовать геометрические "точные" методы также не получиться. Этот вопрос уже обсуждался на форуме экспоненты.

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


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

Вы только что сами все сказали интерполяция просто клонирует спектр. И если по исходному спектру нельзя точно померить, то и по "клонированному" тоже не получится, так как все повторяющиеся куски полностью совпадают с исходным. После фильтрации в идеале опять останется исходный спектр, по которому нельзя точно померить. А поскольку идеального фильтра нет, то вы только уменьшите точность оценки амплитуды. Еще раз повторяю: интерполяция не вносит никакой дополнительной информации, поэтому не может улучшить точности оценки.

 

Что касается фильтрации до интерполяции, то опять таки отсутствие идеального фильтра не полностью подавит высшие гармоники и использовать геометрические "точные" методы также не получиться. Этот вопрос уже обсуждался на форуме экспоненты.

Так я ж не спорю, что интерполяция не генерирует дополнительную информацию - ей неоткуда взяться на том же числе точек. Интерполяция позволяет с максимальной точностью (используя предоставленную выборку) решить задачу на временной области (не на частотной, а на временной. И только). А предварительная фильтрация все равно улучшит сигнал (насколько сможет). Допустим, гармоника имеют -40 дБ (что хорошо), а фильтр -60. Наверняка хватит и отличаться от максимально возможного почти не будет.

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

Если сравнивать FFT или свертку, то разницы конечного результата не будет при всех равных условиях.

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


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

Так я ж не спорю, что интерполяция не генерирует дополнительную информацию - ей неоткуда взяться на том же числе точек. Интерполяция позволяет с максимальной точностью (используя предоставленную выборку) решить задачу на временной области (не на частотной, а на временной. И только). А предварительная фильтрация все равно улучшит сигнал (насколько сможет). Допустим, гармоника имеют -40 дБ (что хорошо), а фильтр -60. Наверняка хватит и отличаться от максимально возможного почти не будет.

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

Если сравнивать FFT или свертку, то разницы конечного результата не будет при всех равных условиях.

 

просто применил окно к сигналу, и получил погрешность чуть выше 1%

 

Код MATLAB:

 

T = 0.02;

Ts = 1/1200;

f = 55;

t = 0:Ts:T-Ts;

A = 10;

df = 1/T;

Fmax = 1/Ts;

n = length(Y);

w = hamming ( n, 'periodic');

f1 = 0:df:Fmax-df;

Y = A*sin(2*pi*f*t) ;

Xw = fft(Y.*w.')/sum(w);

X = fft(Y)/n;

subplot(2,1,1), stem(f1, abs(X)), grid

title('Спектр сигнала 24 выборки без окна')

subplot(2,1,2), stem (f1, abs(Xw)), grid

title('Спектр сигнала 24 выборки c окном')

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


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

... как ещё можно минимизировать погрешность???

 

Ещё можно адаптивной фильтрацией.

Вот здесь минимизируют через LMS предсказание синуса вместе с тремя гармониками

http://rapidshare.com/files/299646763/Nove...acking.pdf.html

Но следящая система будет работать не спешно

 

просто применил окно к сигналу, и получил погрешность чуть выше 1%

 

Y = A*sin(2*pi*f*t) ;

Xw = fft(Y.*w.')/sum(w);

X = fft(Y)/n;

 

Так это без шума. Без шума интерполяция в спектральной области даст почти бесконечную точность.

Сделайте преобразование Гильберта. Добавить в сигнал в конце нулей (от n до 3*n штук ) по вкусу, сделайте fft, найдите максимум, по 3-м точкам в окрестности максимума проведите параболу, найдите максимум этой параболы, аргумент максимума - это и есть частота

 

Вообще-то есть разные способы сочинять песни племён и все они правильные(с)

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

Статвывод всегда рулит, когда модель адекватна.

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


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

Вообще-то есть разные способы сочинять песни племён и все они правильные(с)

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

Статвывод всегда рулит, когда модель адекватна.

Интерполяция во временной области дает то же самое. Только нужно после интерполяции продолжать работать в той области, где она сделана. Кому что больше нравится (мне, как железячнику, более привычна временная).

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


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

... как ещё можно минимизировать погрешность???

 

На входе почти синусоида, сиг/шум~4, диапазон 10..90 Гц, погрешность оценки частоты +/-0.02 Гц по спектру за 200 точек (частота выборок 200 Гц, время измерения 1 с). Все утопталось в ATmega8, осталось под индикатор и обмен с PC. Алгоритм используется полгода в другом серийном устройстве.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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