书到用时
发表于 2019-12-5 21:35:16
yjmwxwx
发表于 2019-12-5 21:38:19
书到用时 发表于 2019-12-5 21:35
楼主头像是三把锄头吗?
镢头,下地干活经常用最小的那种
书到用时
发表于 2019-12-5 22:01:14
yjmwxwx
发表于 2019-12-5 22:07:27
书到用时 发表于 2019-12-5 22:01
镢头是干什么活用的,和镐是同一种东西吗?
挖坑、挖沟、刨根用途很多,冷兵器时代还能当武器。
peiguoqing
发表于 2019-12-10 11:14:06
LZ,您的图纸显示,从信号输出,到ADC采集,竟然都是直流耦合。应该影响不小吧。
当初设计时,没有考虑过交流耦合,是不是更稳定一些?XJW01老师的也是交流耦合。请参考。
请教下:DFT ,FFT 算法,能给讲讲吗?比如,我采集了200个数据,怎么转换?
谢谢!:handshake
yjmwxwx
发表于 2019-12-10 15:32:58
本帖最后由 yjmwxwx 于 2019-12-10 15:35 编辑
peiguoqing 发表于 2019-12-10 11:14
LZ,您的图纸显示,从信号输出,到ADC采集,竟然都是直流耦合。应该影响不小吧。
当初设计时,没有考虑过 ...
电路我也不懂,仪表放大器一开始前面也加过104瓷片电容,后来拆掉也没影响就去掉了,不知道是不是电容质量不行加和不加没区别。
DFT很简单,就是采集到的数据乘正弦和余弦,用主帖里面那个生成正弦表和余弦表的C程序生成200点正弦表和200点余弦表,200点数据分别和余弦表相乘结果再累加就是实部,分别和正弦表相乘累加结果是虚部。
FFT比较麻烦,一开始需要位反转,语言描述比较麻烦,我这有个基-2的模拟程序,不过这个只能计算8、16、32等数据,不能计算200点的,你先用16点的数据看每一步怎么计算的就知道原理了。
就是复数乘法和加减法,只是定点数计算容易益出。
模拟程序
yjmwxwx
发表于 2019-12-10 15:50:29
peiguoqing 发表于 2019-12-10 11:14
LZ,您的图纸显示,从信号输出,到ADC采集,竟然都是直流耦合。应该影响不小吧。
当初设计时,没有考虑过 ...
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main() {
float m,pi,sr,si;
int rr,ii, n,i;
n=100;
m=2;
pi=3.141592;
for(i=0;i<n;i++){
sr=cos(2*pi*i*m/n);
si=-sin(2*pi*i*m/n);
rr=sr*0x8000;
ii=si*0x8000;
printf("0x%04X,0x%04X,",rr,ii);
}
printf("\n");
}
就是这个程序生成正弦和余弦表,我C语言不熟悉,不知道这个程序有没有问题,n是点数,m是代表需要哪个点的频率,本来我做的这个表ADC是1M采样率,除100=10K,每个点10K,我这个表应该在第1个点上,而第1个点上发现数很小,所以就取了第2个,这地方可能有问题,我也不熟悉数字信号处理,不知道到底是哪里问题,网上问也没人解答,也没仪器测正弦波的频率到地是多少,或者采样率不准确,这地方最后我也没搞懂。
我这程序都是自己写的,不是官方的库函数,库函数我还不会用,可能我写的程序有问题,要是能对比下就好了。
peiguoqing
发表于 2019-12-10 20:02:33
yjmwxwx 发表于 2019-12-10 15:50
就是这个程序生成正弦和余弦表,我C语言不熟悉,不知道这个程序有没有问题,n是点数,m是代表需要哪 ...
上面这个程序,由于m=2;推算出,这是计算出了0---4π范围的数据吧。
把m去掉,就是2π范围啊,2*π*i/100; i取值(0---100);是吧?
peiguoqing
发表于 2019-12-10 20:30:46
本帖最后由 peiguoqing 于 2019-12-10 20:32 编辑
采集数据是不是应该采集0--π,100个点;再采集π/2-----3π/2,100个点。因为相差90°;您怎么采集2π范围的数据呢?
如果这个思路是对的话,C语言编写的正弦余弦函数表,应该每个表采集200个吧?对吗?
,m是代表需要哪个点的频率? 什么意思?
一共才运算2π范围,哪里的频率呢?
peiguoqing
发表于 2019-12-10 20:52:26
yjmwxwx 发表于 2019-12-10 15:32
电路我也不懂,仪表放大器一开始前面也加过104瓷片电容,后来拆掉也没影响就去掉了,不知道是不是电容 ...
请教下,这个图怎么看呢?
前一个数据+后一个数据=d1;
前一个数据-后一个数据=d2;
就是这样作加减法吗?
yjmwxwx
发表于 2019-12-10 21:53:08
本帖最后由 yjmwxwx 于 2019-12-10 22:25 编辑
peiguoqing 发表于 2019-12-10 20:30
采集数据是不是应该采集0--π,100个点;再采集π/2-----3π/2,100个点。因为相差90°;您怎么采集2π范围 ...
这个是计算旋转因子的,我也是在书上看的,不懂为什么这么算。m是频域,n是时域
就是下面这本书
https://yadi.sk/i/ZOUfF96f3QkNMT
yjmwxwx
发表于 2019-12-10 22:02:38
本帖最后由 yjmwxwx 于 2019-12-10 22:32 编辑
peiguoqing 发表于 2019-12-10 20:52
请教下,这个图怎么看呢?
前一个数据+后一个数据=d1;
这个要用复数计算器,其实不想要自己写FFT程序没必要了解细节。
比如下面这个
先用蝴蝶左下乘法旋转因子
(−52078.4160+6222.384i)×(0.8819−0.4714i)=−42994.7232528+30037.285752i
蝴蝶左上 加 第一个式子的结果等于蝴蝶右上
(−37232.3232+41095.1136i)+(−42994.7232528+30037.285752i)=−80227.0464528+71132.399352i
蝴蝶左上减 第一个式子的结果等于蝴蝶右下
(−37232.3232+41095.1136i)−(−42994.7232528+30037.285752i)=5762.4000528+11057.827848i
很简单的,就是乘法、加法、减法
复数计算方法
peiguoqing
发表于 2019-12-11 07:25:11
yjmwxwx 发表于 2019-12-10 22:02
这个要用复数计算器,其实不想要自己写FFT程序没必要了解细节。
比如下面这个
蝴蝶左下乘法旋转因子是什么?
就是您用c语言编写的那个程序吗? 里面那个m=2;怎么不变化呢?真心想知道。:handshake
yjmwxwx
发表于 2019-12-11 08:27:00
比如我采样率1M,M=2就是20K频率正弦波和余弦波,那个C程序就是计算这个频率的正弦表和余弦表,这个我也是在书上看的,按理说我这个是10K的不知道为啥跑到了20K上面,可能是泄漏,也可能是采样率不准或者正弦波频率不准。
FFT计算旋转因子的是下面这个C程序,n表示采样点数,上面给的那本书里面都有,介绍比较详细,我说的不如书里面详细。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main() {
float pi,sr,si;
int rr,ii, n,i;
n=8;
pi=3.141592;
for(i=0;i<n/2;i++){
sr=cos(2*pi*i/n);
si=-sin(2*pi*i/n);
rr=sr*0x8000;
ii=si*0x8000;
printf("0x%04X,0x%04X,",rr,ii);
}
printf("\n");
}
乘0x8000是Q15定点数
maluping
发表于 2019-12-11 09:40:53
看着楼主搭电路的风格,顷刻间觉得您可爱,这技术用到胆机上美美的。相当于独创迷踪拳,可自成一派。