打印

数字电桥软件算法分析

[复制链接]
楼主: 叶春勇
手机看帖
扫描二维码
随时随地手机跟帖
21
叶春勇|  楼主 | 2021-5-15 21:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
Jack315 发表于 2021-5-15 18:14
假设读数服从 N(m, s^2) 分布、被测量值的真值为 x,
则 m - x 代表的是准确度,s 代表的是精确度。
k 次 ...

看来我前面没表达清楚,电路上接的是3.6k电阻,跨阻放大器上接的是1.8k,理论正值为2.0,目前是想矫正相位。
我是用fs=100khz,采集200个数据
然后对200个数据进行单项dft,取第二项(n从0开始)
然后进行计算,返回阻抗,进行200次测量,取两组样本,每个组100个阻抗

第二次用,fs=100khz,采集400个数据
然后对400个数据进行单项dft,取第四项,4
然后进行计算,返回阻抗,进行200次测量,取两组样本,每个组100个阻抗

第三次用,fs=100khz,采集800个数据
然后对800个数据进行单项dft,取第八项,8
然后进行计算,返回阻抗,进行200次测量,取两组样本,每个组100个阻抗

第四次,用fs=100khz,采集1600个数据
然后对1600个数据进行单项dft,取第16项,16
然后进行计算,返回阻抗,进行200次测量,取两组样本,每个组100个阻抗

单片机算法已经调好了,现在单片机发出的不是原始数据,而是经过单项dft,进行计算的阻抗
四次计算,采样率相同,采集量不一样,软件算法略有不同,单项dft长度不一样。
现在发现,单片机计算的阻抗值的标准差再下降。这个标准差,不能反映硬件吗?




使用特权

评论回复
22
叶春勇|  楼主 | 2021-5-15 21:32 | 只看该作者
我是在验证这个博士论文中的,说提高数据长度,可改善信噪比。

使用特权

评论回复
23
Jack315| | 2021-5-15 22:44 | 只看该作者
叶春勇 发表于 2021-5-15 21:32
我是在验证这个博士论文中的,说提高数据长度,可改善信噪比。

推论:
N -> inf, SN->inf, 测量出真值。

这个推论觉得如何?

人工测量或许 N -> inf 比较难,电脑 / 单片机应该不那么困难了。
为什么这世上还有那么多的量具不过关?

量具的精度取决于硬件的设计和元件的精度。
ADC 的 SN 与 ADC 的位数 N 有关:
SN = 6.02 N + 1.76 (dB)

ADC SNR.pdf (76.34 KB)

使用特权

评论回复
24
Jack315| | 2021-5-15 22:49 | 只看该作者
本帖最后由 Jack315 于 2021-5-15 22:51 编辑

N 个是相同分布的电阻串联可获得精度更高的电阻;
N 次连续采样却不代表量具精确度的提高。
尽管其统计理论的原理是一样的。

使用特权

评论回复
25
叶春勇|  楼主 | 2021-5-15 23:24 | 只看该作者
Jack315 发表于 2021-5-15 22:49
N 个是相同分布的电阻串联可获得精度更高的电阻;
N 次连续采样却不代表量具精确度的提高。
尽管其统计理论 ...

你在我的三极管统计实验中,贴了一张图

其中精确度,根据图中所示,明显表达的是标准差或方差
而准确度,反映的是与真值的差距,可以用平均值表达
我的理解,精确度,反映了仪表电路的一致性。
准确度,反映了,仪表的校准水平。
所以我认为标准差反映的是硬件的一致性。


使用特权

评论回复
评论
Jack315 2021-5-16 06:06 回复TA
正解。 
26
叶春勇|  楼主 | 2021-5-15 23:27 | 只看该作者
Jack315 发表于 2021-5-15 22:44
推论:
N -> inf, SN->inf, 测量出真值。

如果硬件测量的标准差或方差太大,很难校准

使用特权

评论回复
27
雪山飞狐D| | 2021-5-16 00:29 | 只看该作者
叶春勇 发表于 2021-5-14 10:57
这个电容用测量得值如下:

比较接近相差43.1-43.3=0.2nf

    首先不能用这种表做对比基准,因为这种表电容档误差是0.5%-1%以上,你需要的是一个经过高级仪器测试过的一个标准电容,比如被测试标定为100.X nF

使用特权

评论回复
28
Jack315| | 2021-5-16 06:09 | 只看该作者
叶春勇 发表于 2021-5-15 23:27
如果硬件测量的标准差或方差太大,很难校准

校准针对的是均值,是关于准确度的。标准差的大小并不影响校准操作。

使用特权

评论回复
29
叶春勇|  楼主 | 2021-5-17 11:24 | 只看该作者
今天实验了方波同步检波,也就是郑君里版本的沃尔什变换测得数据:
a=[1.9855957551405872, 1.9851922847795145, 1.9939645530819001, 2.0002605954916737, 1.9825408397211379, 1.9934522053088992, 1.9894210227845091, 1.984738707587848, 1.999091601387091, 1.9804902832662243, 1.9856627750040865, 1.9825786082492669, 1.9875518295805787, 1.9980361105795237, 1.9890008670157011, 1.9894277812105274, 1.9998429339098867, 1.9891604637068074, 1.9957015746371074, 1.9992538534828095, 1.9827001699360081, 1.9869186933110508, 1.9890195806379569, 1.9907771844254276, 1.9884877995197399, 2.00392942206493, 1.9858782914728708, 1.9882542419908924, 1.9858588359538443, 1.9942026905631727, 1.9923906466613241, 1.989344496727214, 1.9993086103666902, 1.9854988091084169, 1.9913516767762884, 1.9989669661645126, 2.0019694595451911, 1.9938956191859714, 1.9832375055818383, 1.9859251629136232, 1.990284949126619, 1.9836167117177024, 1.9871670403606418, 1.983942432635696, 1.9979175562402698, 1.9871870346998743, 1.9889595210537179, 1.9974708616987844, 1.9824496933241025, 1.9897496272133814, 1.9854006256499412, 1.9859687358945195, 1.9796177800374066, 1.9971535160187543, 1.9946100286348172, 1.9877832184612567, 1.9928694583587265, 1.9787830873903536, 1.9872965954589537, 1.997496771531762, 1.9888146305986893, 1.9856110356354877, 1.989330069443489, 1.9871015830042864, 1.9838042957861044, 1.9918512905527701, 1.9880378201387505, 1.9921959604889869, 1.9911265892045855, 1.9967627178464553, 1.9924115374655795, 1.9983962216657596, 1.9887735666521571, 1.9950054384541533, 1.9910824609252096, 1.9904848609155157, 1.9807336604092343, 1.9861296141132692, 1.9952427786306151, 1.9860437173018712, 1.9889726246726993, 1.9907671141921131, 1.9906240084393552, 1.9877273071142672, 1.9948919703558912, 1.9790722755453802, 1.9984162714785283, 1.9864357616048041, 1.9992937995191153, 1.9833148747818674, 1.9922096046528697, 1.9860610816264654, 1.9864939798663852, 1.9895317675419499, 1.9951502720649981, 1.9873251300342152, 1.9890763293588485, 1.9912888448445172, 1.9938074229464271, 1.9822470739108953]
沃尔什变换与傅里叶变换的标准差不大,沃尔什实际略优于傅里叶变换
 for(i=0;i<SIZE_OF_SAMPLES;i++)
                  {
                          temp=rect_r(i)*data[2*i];
                          voltage[0]+=temp;
                          temp=rect_i(i)*data[2*i];
                          voltage[1]+=temp;
                          temp=rect_r(i)*data[2*i+1];
                          current[0]+=temp;
                          temp=rect_i(i)*data[2*i+1];
                          current[1]+=temp;
                  }
int16_t rect_r(uint16_t index)
{
        int8_t rect_table[]={1,1,-1,-1};
        return rect_table[(4*index/SAMPLES_OF_A_PERIOD)%4];
}

int16_t rect_i(uint16_t index)
{
        int8_t rect_table[]={1,-1,-1,1};
        return rect_table[(4*index/SAMPLES_OF_A_PERIOD)%4];
}


使用特权

评论回复
30
叶春勇|  楼主 | 2021-5-17 11:28 | 只看该作者
雪山飞狐D 发表于 2021-5-16 00:29
首先不能用这种表做对比基准,因为这种表电容档误差是0.5%-1%以上,你需要的是一个经过高级仪器测试 ...

还未进入标定环节,现在是想办法干掉dft,运算量太大。用的是单独一项的dft。
正在测试dwt,沃尔什变换,没有乘法。可以移植到51的单片机

使用特权

评论回复
31
叶春勇|  楼主 | 2021-5-17 11:51 | 只看该作者
本帖最后由 叶春勇 于 2021-5-17 12:00 编辑

这个是在pc机上实现的沃尔什变换,用来测一楼得43.1nf电容的程序,移除了乘法。在交流测量中,大部分没人关心信号的频谱,更关注特定频率信号的幅度或相位,或两个都关注。也就前面帖的论文所说的窄带信号。
傅里叶变换有个sin表和乘法,让低端8位单片机望而却步。除了滑动傅里叶还有沃尔什变换。
下面是在pc机上测试的沃尔什变换(单相),经比较,无乘法运算。rect_r和rect_i中的除法,可以用采集2^n周期来变成移位算法。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <complex.h>
#include <math.h>

#define SIZE_OF_SAMPLES 200
#define PERIOD 100
int16_t v1[]={2714, 2698, 2690, 2661, 2635, 2603, 2578, 2527, 2486, 2437, 2385, 2333, 2277, 2214, 2144, 2062, 1984, 1942, 1870, 1794, 1743, 1745, 1569, 1494, 1411, 1340, 1247, 1180, 1110, 1039, 978, 911, 835, 759, 710, 648, 586, 550, 494, 458,
415, 384, 351, 333, 312, 290, 276, 270, 267, 268, 275, 278, 302, 320, 356, 364, 423, 453, 495, 541, 590, 651, 703, 777, 823, 899, 964, 1042, 1121, 1184, 1264, 1356, 1301, 1499, 1577, 1655, 1719, 1756, 1882, 1953, 2027, 2152, 2166, 2230, 2295,
2348, 2387, 2450, 2500, 2543, 2582, 2610, 2647, 2670, 2694, 2709, 2720, 2722, 2724, 2722,2712, 2698, 2679, 2653, 2634, 2600, 2560, 2518, 2487, 2432, 2373, 2323, 2264, 2198, 2140, 2070, 2005, 1937, 1861, 1785, 1709, 1626, 1559, 1471, 1404, 1328,
1258, 1172, 1099, 1027, 954, 890, 831, 676, 691, 637, 586, 550, 475, 449, 409, 374, 353, 335, 301, 284, 272, 267, 268, 264, 278, 285, 301, 328, 358, 381, 411, 450, 494,
    544, 608, 670, 713, 778, 839, 909, 978, 1051, 1123, 1198, 1280, 1355, 1433, 1511, 1590, 1668, 1744, 1815, 1892, 1968, 2047, 2105, 2171, 2237, 2306, 2354, 2410, 2460, 2514, 2521, 2586, 2622, 2646, 2712, 2682, 2707, 2720, 2725, 2769, 2744};

int16_t v2[]={1578, 1594, 1642, 1677, 1715, 1750, 1779, 1809, 1850, 1881, 1905, 1935, 1957, 1986, 2001, 2007, 2004, 2048, 2068, 2078, 2107, 2149, 2100, 2086, 2093, 2092, 2088, 2072, 2067, 2039, 2034, 2020, 1997, 1976, 1958,
1931, 1900, 1878, 1845, 1805, 1782, 1747, 1710, 1690, 1657, 1607, 1573, 1533, 1505, 1466, 1426, 1390, 1354, 1302, 1281, 1230, 1207, 1166, 1147, 1113, 1068, 1048, 1031, 1002, 977, 963, 935, 932, 919, 894, 887, 885, 778, 887,
894, 890, 889, 878, 916, 917, 945, 984, 984, 1008, 1028, 1052, 1080, 1096, 1144, 1169, 1204, 1242, 1279, 1304, 1350, 1389, 1436, 1463, 1505, 1540,1578, 1615, 1649, 1686, 1723, 1759, 1784, 1816, 1845, 1885, 1907, 1930, 1962,
1972, 2009, 2020, 2036, 2053, 2075, 2082, 2092, 2093, 2097, 2087, 2096, 2083, 2092, 2072, 2066, 2047, 2035, 2023, 2002, 1935, 1951, 1925, 1908, 1890, 1826, 1814, 1770, 1746, 1696, 1685, 1644, 1600, 1563, 1529, 1497, 1443,
1422, 1382, 1338, 1311, 1277, 1240, 1199, 1168, 1134, 1105, 1082, 1051, 1029, 1002, 977, 962, 946, 912, 913, 902, 890, 884, 887, 883, 893, 893, 895, 901, 918, 933, 941, 961, 987, 1019, 1029, 1062, 1085, 1119, 1148, 1168,
1212, 1250, 1283, 1338, 1372, 1400, 1436, 1476, 1520, 1562};


uint16_t rect_r(uint16_t a)
{
    uint8_t rect_table[]={1,1,0,0};
    return rect_table[(4*a/PERIOD)%4];
}

uint16_t rect_i(uint16_t a)
{
    uint8_t rect_table[]={1,0,0,1};
    return rect_table[(4*a/PERIOD)%4];
}

int32_t dwt_r(int16_t *list)
{
    int32_t acc=0;
    uint32_t i,j,index_ra,index_rb;
    for(i=0;i<SIZE_OF_SAMPLES;i++)
    {
        if(rect_r(i))
        {
            acc+=list[i];
        }
        else
        {
            acc-=list[i];
        }
    }
    return acc;
}

int32_t dwt_i(int16_t *list)
{
    int32_t acc=0;
    uint32_t i,j,index_ia,index_ib;
    for(i=0;i<SIZE_OF_SAMPLES;i++)
    {
        if(rect_i(i))
        {
            acc+=list[i];
        }
        else
        {
            acc-=list[i];
        }
    }
    return acc;
}

int main()
{
    uint32_t i=0;
    double complex cv1,cv2,Y,coeffs;
    coeffs=1/(2*M_PI*1e3*1800);
    printf("%d,%d,%d,%d\n",dwt_r(v1),dwt_i(v1),dwt_r(v2),dwt_i(v2));
    cv1=dwt_r(v1)+dwt_i(v1)*I;
    cv2=dwt_r(v2)+dwt_i(v2)*I;
    Y=cabs(cv2/cv1)*coeffs;
    printf("%e,%e\n",cabs(Y));

    for(i=0;i<200;i++) printf("%d",rect_r(i));
    printf("\n");
    for(i=0;i<200;i++) printf("%d",rect_i(i));

    return 0;
}
程序运行结果4.315051e-008,0.000000e+000
43.15nf,比对傅里叶变换,更接近表的数值。

使用特权

评论回复
32
yjmwxwx| | 2021-5-18 07:46 | 只看该作者
本帖最后由 yjmwxwx 于 2021-5-18 07:55 编辑

楼主加油,国内业余爱好者设计的LQ-9101电桥,用的专用ADC芯片,卖的很贵但是还有人买,别人评价还不错,下面就是那个人的帖子,楼主可以看看有没有参考价值

http://www.crystalradio.cn/thread-354429-1-1.html

使用特权

评论回复
33
csdnpurple| | 2021-5-18 08:59 | 只看该作者
本帖最后由 csdnpurple 于 2021-5-18 09:03 编辑
yjmwxwx 发表于 2021-5-18 07:46
楼主加油,国内业余爱好者设计的LQ-9101电桥,用的专用ADC芯片,卖的很贵但是还有人买,别人评价还不错,下 ...

这个更香:

使用特权

评论回复
34
叶春勇|  楼主 | 2021-5-18 09:00 | 只看该作者
本帖最后由 叶春勇 于 2021-5-18 09:08 编辑
yjmwxwx 发表于 2021-5-18 07:46
楼主加油,国内业余爱好者设计的LQ-9101电桥,用的专用ADC芯片,卖的很贵但是还有人买,别人评价还不错,下 ...

我是手上剩余的stm32f103c8t6,现在涨上天了。没法跟别人竞争了。我手上有10片stm32f030f4p6(要是多买几片就好了),里面就一个adc,就没用。
我看你了你的电桥视频,测量要好几秒。实际上不用全部fft的,只需要单项fft就可以。单项fft与(同步检波+均值滤波)等效。我看了一下你给的链接跟xwj的没啥区别都有模拟鉴相器。


使用特权

评论回复
35
yjmwxwx| | 2021-5-18 11:10 | 只看该作者
叶春勇 发表于 2021-5-18 09:00
我是手上剩余的stm32f103c8t6,现在涨上天了。没法跟别人竞争了。我手上有10片stm32f030f4p6(要是多买几 ...

我做那个主要两个ADC通道来回切换浪费时间,采一次数据要采集4次,上臂采正负电压下臂采正负电压,所以很慢,采的256点频率越低越慢,还有上次你给说的那个滤波程序效率的问题,电路和程序都不怎么行。
不知道能不能用测体脂的ADC芯片改个电桥,那个里面有DDS了,现在MCU太贵了。看到下面这个ADC比较便宜,就是不知道能不能改成电桥。


使用特权

评论回复
36
叶春勇|  楼主 | 2021-5-18 11:33 | 只看该作者
yjmwxwx 发表于 2021-5-18 11:10
我做那个主要两个ADC通道来回切换浪费时间,采一次数据要采集4次,上臂采正负电压下臂采正负电压,所以很 ...

电子秤芯片接受的好像是大于0V的共模电压



使用特权

评论回复
37
yjmwxwx| | 2021-5-18 12:38 | 只看该作者
叶春勇 发表于 2021-5-18 11:33
电子秤芯片接受的好像是大于0V的共模电压

我基础差,看不懂。


不知道这个测体脂的到底能不能改成电桥,要是能改就省钱了
这ADC芯片资料看了看就是不知道他是怎么测相角的


C914969_CS1256-S0P16_2020-11-03.PDF (1.68 MB)

使用特权

评论回复
38
叶春勇|  楼主 | 2021-5-18 14:47 | 只看该作者
yjmwxwx 发表于 2021-5-18 12:38
我基础差,看不懂。

这个好像应该是测阻抗的模

内部集成了精密整流模块,跟ad5933输出复阻抗不一样的。测相位还得想办法
不过这个芯片的模拟前端不错,有个minidds

使用特权

评论回复
39
yjmwxwx| | 2021-5-18 16:21 | 只看该作者
叶春勇 发表于 2021-5-18 14:47
这个好像应该是测阻抗的模

内部集成了精密整流模块,跟ad5933输出复阻抗不一样的。测相位还得想办法

主要感觉这个芯片真的便宜,而且里面还集成了很多东西,要是能改就省钱了

使用特权

评论回复
40
叶春勇|  楼主 | 2021-5-20 15:51 | 只看该作者
本帖最后由 叶春勇 于 2021-5-20 16:00 编辑
king5555 发表于 2021-5-17 22:29
很好的。可以先做出第一版并且留存样品,即使是阳春版的也无妨。将来有空再研究第二版,乃至第三丶四版本 ...

主参数还行,副参数难搞这是测3.6k电阻

这是测47nf电容



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则