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

Коллеги, что порекомендуете для вычисления RMS по выборкам?

4 minutes ago, Plain said:

Без разницы, как, но никакого окна ни в официальных бумажках, ни наяву, там точно нет, потому что метрологически это уничтожение сигнала.

Если заранее известно, что сигнал периодический, то по одному периоду сигнала можно однозначно восстановить все "уничтоженные" значения сигнала. Поэтому с точки зрения метрологии уничтоженные значения сигнала никакой новой информации о сигнале не содержат.

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


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

Уничтожается сигнал на краях окна. Чтобы сохранить площадь окна, равную прямоугольному, логично увеличить масштаб по амплитуде (в центре будет не 1, а больше). И всё. 

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


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

15 минут назад, blackfin сказал:

Если заранее известно, что сигнал периодический

Да, реализуемая 100% сил пользователя завлекуха под названием SETACV SYNC, я читал паспорт.

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


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

19 hours ago, blackfin said:

Сколько Вольт покажет ваша формула при измерении RMS синусоиды с амплитудой 1 Вольт за время измерения 0.16 секунды ?

Ну, наконец, что-то конкретное.

 

Моя формула показывает квадратный корень из 1/2. Ничего удивительного. Ведь считается именно RMS. Разумеется, что при целочисленных выборках АЦП, появятся неточности, но ведь мы проверяем алгоритм.

Не верите -- ищите ошибки:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define INTERVAL_SEC 0.16
#define FREQ 50.0
#define SAMPLING_F_HZ 1000.0
#define MAX_SAMPLES 300
#define AMPLITUDE_V   1.0
#define OFFSET        (AMPLITUDE_V + AMPLITUDE_V/2)
#define TOTAL_SAMPLES (INTERVAL_SEC * SAMPLING_F_HZ)
#define PERIOD_IN_SAMPLES (SAMPLING_F_HZ/FREQ)

#define PERIODS  (INTERVAL_SEC*FREQ)
double sin_samples[MAX_SAMPLES];

void generate()
{
        int i;
        for(i = 0; i < TOTAL_SAMPLES; i++){
                sin_samples[i] =  AMPLITUDE_V * sin(2 * M_PI * (double)i / PERIOD_IN_SAMPLES);
                sin_samples[i] += OFFSET;
        }
}

double rms_square()
{
        int i;
        double sum = 0;
        double sum_square = 0;
        double sample, result;

        for(i = 0; i < TOTAL_SAMPLES; i++){
                sample = sin_samples[i];
                sum += sample;
                sum_square += sample * sample;
        }
        result = sum_square -  sum * sum/TOTAL_SAMPLES;
        result /= TOTAL_SAMPLES;
        return result;
}

int main()
{
        int i;

        if(TOTAL_SAMPLES > MAX_SAMPLES){
                printf("Error: %d is too high sampling rate for the buffer size\n", MAX_SAMPLES);
                exit(1);
        }

        printf("periods = %f DC offset: %f samples: %d\n ", PERIODS, OFFSET, (int)TOTAL_SAMPLES);
        generate();

#ifdef DEBUG
        for(i = 0; i < TOTAL_SAMPLES; i++){
                printf("%f\n", sin_samples[i]);
        }
#endif

        printf("square RMS: %f\n", rms_square());

        return 0;
}

Печатает: 

periods = 8.000000 DC offset: 1.500000 samples: 160
square RMS: 0.500000

 

Для GCC компилировать командой:
gcc test.c -lm -DDEBUG -g
или без отладки

gcc test.c -lm

 

 

 

15 hours ago, ViKo said:

Уничтожается сигнал на краях окна. Чтобы сохранить площадь окна, равную прямоугольному, логично увеличить масштаб по амплитуде (в центре будет не 1, а больше). И всё. 

Окно не по этой причине используют. Без окна аппаратная функция будет sin(x)/x с длинными хвостами. С окном она будет прямоугольной без вылезания на соседние точки.

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


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

160 мс - это ровно 8 периодов 50 Гц. Посчитайте для 150 мс. 

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


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

7 hours ago, ViKo said:

160 мс - это ровно 8 периодов 50 Гц. Посчитайте для 150 мс. 

periods = 7.500000 DC offset: 1.500000 samples: 150
 square RMS: 0.498228

0.3544 %

а после извлечения корня:

0.1774%

 

Это получилось за счет того, что неполный период сместил положение среднего значения.

 

За 1.15 секунды:
periods = 57.500000 DC offset: 1.500000 samples: 1150
 square RMS: 0.499970
 

Вклад неполного периода значительно меньше.

 

за 1 период:

periods = 1.000000 DC offset: 1.500000 samples: 20
square RMS: 0.500000
 

 

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


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

10 hours ago, Tarbal said:

Печатает: 

OK. Спасибо..

 

В МАТLAB'е это всё существенно короче:

clear all;
A  = 1.0;                                % Амплитуда сетевой гармоники [В]
T  = 0.16;                               % Интервал измерения [сек]
fd = 1.0e5;                              % Частота дискретизации [Гц]
dt = 1/fd;                               % Шаг дискретизации [сек]
t  = 0:dt:T;

for i = 1:2000
Fs(i) = 45.0+0.01*(i-1);                 % Частота сетевой гармоники [Гц]
St = A*sin(2*pi*Fs(i)*t);                % Сетевая гармоника
RMS(i) = sqrt(var(St));                  % Квадратный корень из дисперсии
ERR(i) = abs(RMS(i)-A/sqrt(2.0));        % Ошибка измерения RMS [В]
end;

figure(1);
plot(Fs,ERR,'b');
axis tight
grid on
xlabel('Частота сети [Гц]')
ylabel('Ошибка измерения RMS [В]')
legend('Ошибка измерения RMS [В]');

 

RMS.jpg

 

 

6 hours ago, Tarbal said:

а после извлечения корня:

0.1774% 

Надеюсь, теперь вам наконец понятно, какова точность вашей формулы для RMS.. :)

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


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

16 minutes ago, blackfin said:

OK. Спасибо..

Надеюсь, теперь вам наконец понятно, какова точность вашей формулы для RMS.. :)


А вы своей формулой посчитайте. Ошибка из-за неточности измерения среднего, потому, что неполный период. Когда  точно, то ошибка 0%
Покажите за 150 миллисекуд результат.

Заодно учтите, что я сместил на полтора вольта, чтобы АЦП не выходил за пределы. Добавьте-ка 100 милливольт смещения к вашей формуле.

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


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

12 minutes ago, Tarbal said:

А вы своей формулой посчитайте. Ошибка из-за неточности измерения среднего, потому, что неполный период. Когда  точно, то ошибка 0%
Покажите за 150 миллисекуд результат.

Ну я уже десять раз давал здесь ссылку на результат "своей" формулы: Ошибка измерения RMS с окном Гаусса

 

12 minutes ago, Tarbal said:

Добавьте-ка 100 милливольт смещения к вашей формуле.

Добавлял уже и 100 милливольт. Ошибка в RMS не превышает 0.01%. Посмотрите несколькими постами выше. Или вам нужен именно график?

 

PS. Точнее, добавлял не 100 милливольт, а 10 милливольт. Ошибка в 100 милливольт (т.е., 10% шкалы) после калибровки это как-то выходит за рамки моего понимания.. :)

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


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

6 minutes ago, blackfin said:

Ну я уже десять раз давал здесь ссылку на результат "своей" формулы: Ошибка измерения RMS с окном Гаусса

 

Добавлял уже и 100 милливольт. Ошибка в RMS не превышает 0.01%. Посмотрите несколькими постами выше. Или вам нужен именно график?

 

PS. Точнее, добавлял не 100 милливольт, а 10 милливольт. Ошибка в 100 милливольт (т.е., 10% шкалы) после калибровки это как-то выходит за рамки моего понимания.. :)

Моя формула устойчива со 150% шкалы. Даже 500% не изменят результата.

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


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

6 minutes ago, Tarbal said:

Моя формула устойчива со 150% шкалы.

Вопрос не в устойчивости формулы, а в её точности и в границах её применимости.

Что касается калибровки, то она нужна и для вашей чудо-формулы, потому как кроме калибровки нуля, нужно калибровать ещё и масштаб по напряжению.

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


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

8 minutes ago, blackfin said:

 Вопрос не в устойчивости формулы, а в её точности и в границах её применимости.

Что касается калибровки, то она нужна и для вашей чудо-формулы, потому как кроме калибровки нуля, нужно калибровать ещё и масштаб по напряжению.

Не придирайтесь к словам. Именно о точности я и говорю. Если для массовой продукции делитель окажется неточным ипи поплывет от температуры, то он внесет свой вклад в ошибку при вашем подходе. Разные приборы будут давать разный результат.
Скажите, я один здесь вижу, что дисперсия и RMS без постоянной составляющей вычисляются по одной и той же формуле?

Equation for variance equals the sum of X values minus the average of X values squared divided by the number of values N

{\displaystyle {\text{RMS}}\{x[n]\}={\sqrt {{\frac {1}{N}}\sum _{n}{x^{2}[n]}}}={\sqrt {{\frac {1}{N^{2}}}\sum _{m}{{\bigl |}X[m]{\bigr |}}^{2}}}={\sqrt {\sum _{m}{\left|{\frac {X[m]}{N}}\right|^{2}}}}.}

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


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

22 minutes ago, Tarbal said:

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

А вот тут, пожалуйста, подробнее.. :)

 

Каким это образом ваша чудо-формула решает эту проблему?

Неточный делитель изменяет коэффициент передачи сигнала на входе АЦП.

В результате на выходе АЦП будет увеличенное или уменьшенное в (1.0+err) раз напряжение сигнала.

То есть, в формулу для отсчетов сигнала вам вместо AMPLITUDE_V нужно подставлять: AMPLITUDE_V * (1.0+err).

Как без калибровки вы собираетесь устранять эту ошибку???

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


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

9 hours ago, blackfin said:

А вот тут, пожалуйста, подробнее.. :)

 

Каким это образом ваша чудо-формула решает эту проблему?

Неточный делитель изменяет коэффициент передачи сигнала на входе АЦП.

В результате на выходе АЦП будет увеличенное или уменьшенное в (1.0+err) раз напряжение сигнала.

То есть, в формулу для отсчетов сигнала вам вместо AMPLITUDE_V нужно подставлять: AMPLITUDE_V * (1.0+err).

Как без калибровки вы собираетесь устранять эту ошибку???

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

Уверен, что вы полное совпадение формулы вычисления дисперсии с определением RMS тоже выборочно проигнорировали.

Мне переливание из пустого в порожнее уже наскучило. Вы конечно пользуйтесь своей чудо формулой.

Однако моя работает во многих проектах для массовой продукции с 1998 года. Я это знаю точно. Сам использовал.
 

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


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

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

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

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

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

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

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

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

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

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