{"id":28788821,"url":"https://github.com/song-react/ac-analysis","last_synced_at":"2025-10-05T02:10:37.438Z","repository":{"id":82627816,"uuid":"67484341","full_name":"song-react/AC-Analysis","owner":"song-react","description":"AC FFT DC Frequency AC Phase","archived":false,"fork":false,"pushed_at":"2016-09-06T07:30:06.000Z","size":175,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-17T21:04:04.854Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/song-react.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-06T07:29:15.000Z","updated_at":"2016-12-04T08:54:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"482158e2-e135-43d6-8172-e2e46b287388","html_url":"https://github.com/song-react/AC-Analysis","commit_stats":null,"previous_names":["dingsong0/ac-analysis","song-dr/ac-analysis","song-crypto/ac-analysis","song-usa/ac-analysis","song-react/ac-analysis"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/song-react/AC-Analysis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/song-react%2FAC-Analysis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/song-react%2FAC-Analysis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/song-react%2FAC-Analysis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/song-react%2FAC-Analysis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/song-react","download_url":"https://codeload.github.com/song-react/AC-Analysis/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/song-react%2FAC-Analysis/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278399690,"owners_count":25980332,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-17T21:03:57.815Z","updated_at":"2025-10-05T02:10:37.432Z","avatar_url":"https://github.com/song-react.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"###说明\n该项目包含了对离散的数字信号的常用处理算法，包括傅立叶变换，频率计量，有效值计量。可用于示波器、电表、采集模块，信号分析仪等。另外简要说明了电压，电流，有功功率，无功功率，视在功率，四象限功率，功率因，功率因数，功率谱，和电量累计的算法。基于C语言。侧重计算方法，减小误差，提高稳定性。\n\n####去直流\n对buffer取平均值，然后每一项都减去该平均值\n\n\tsum = ∑cX\n\tavg = sum/N\n\tCx -= avg\n\n为了保证buffer与buffer的avg不会“断开”，使用循环队列。\n\n\tsum = ∑cX\n\tcX = cX+1,cN = C1\n\tsum = sum -c1 + cN\n\tavg = sum/N\n\tCx -= avg\n\n引入上一次的avg,逐个消除计算平均值.使用前面N个数的avg来计算当前的直流量，N的取舍不一定，过大会比较迟钝，过小抖动比较厉害，如果是交流。特性类似滤波器，该过程会计算得到很多个平均量，去之流过程放在数字滤波器后面会比较好，减小脉冲给直流量带来干扰。\n\n\tavg = InitValue\n\tsum = avg * N\n\tsum = sum + cX - avgX\n\tavgX = sum / N\n\tcX -= avgX\n\n注：对交流信号，N最好是最大周期整数倍。\n\n####有效值\n一般的计算一段序列有效值，使用均方\n\n\tsum = ∑(Xi*Xi)\n\trms = √(sum/N)\n\n需要得到稳定的rms,Xi的长度需要为Xi周期的整数倍，如果Xi的频率不确定，就需要先计算得到的的频率，假设预先计算到了整数频率f\n\n\tsum = (Xi*Xi) + .. + (X(i+f)*X(i+f))\n\trms = √(sum/f)\n\n实际计算精确的frequency需要的长度要比rms长很多倍，frequency的结果更新要比rms慢，当前要计算的rms使用的f是用包含以前的序列的，而且frequency不一定是整数，所以计算rms不能过度依赖f.就需要使用准同步计算。\n复化求积准同步系数仿真，当计算有效值时，ci为采样平方之后的系数,采样点值为Xi,有效值为A,周期采样点数为m，采样周期数为n.则电流有效值为\n\n\trms=√(∑(Xi * Xi * Coei)/pow(m,n))\n\n如fs为采样频率、连续等间隔采样三个周期,准同步采样算法可知应该总共采样点数和信号为\n\n\tn * (fs/f - 1) + 1\n\tx = √2 A * cos(2 * π/T * t)\n\nMatlab实验,修改频率f对比结果\n\n\tclear all;clc  \n\tfs = 4000\t\t%采样频率\n\tf  = 50;\t\t%信号频率\n\tA  = 220;\t\t%幅度有效值\n\tph = 0;\t\t\t%相位\n\tdc = 0;\t\t\t%直流量\n\tn  = 4;\t\t\t%周期数 \u003e= 2\n\tT  = round(fs/f);\t%每个周期的点数\n\tc  = [ones(1,T)];\t%生成准同步系数\n\tcoe = c\n\tfor i = 1 : n - 1\t\t%迭代卷积n - 1次\n\t    coe = conv(coe,c)\n\tend\n\tt  = 1 : n * (T - 1) + 1;\t\t\t%时间轴\n\tx = A * sqrt(2) * cos((2 * pi)/T * t);\t%模拟波形\n\trms = sqrt(sum(x .* x .* coe ) / (T ^ n))\t\t%计算结果\n\trms2= sqrt(sum(x .* x)/(T * n))\t\t\t%对比结果\n\n####数字滤波器\nIIR数字滤波器\n包括输入和输出流，参考标准算法，使用Matlab FDAtool生成滤波器参数\n没有浮点单元的，使用增益进行整形运算\n\n\t\u003c...\u003e\n\n\n####信号的频率\n一般测量的是最大信号的频率\n\n\t\u003c...\u003e\n\n累计周期\n对信号进行数字滤波，截至频率范围要尽可能小，但包含需要测量频率的衰减不宜过大。累计时间i,搜寻顶点iX-1\u003ciX,iX\u003eiX+1，频率为出现一个顶点与使用时间的比值。\n累计多个顶点数来提高频率的精度，过高没有意义，对频率序列进行滤波没有意义\n对交流信号可以使用累计过零点计算。\n对之流进信号滤波并去之流后也可以使用过零点计算。\n\n\t\u003c...\u003e\n\n硬件方法\n使用硬件帮助完成频率计量，避免软件反复比较。\n将信号通过大电阻和二极管链接到IO上，IO成输入状态，上升沿出发记录时间，两次触发间隔时间为一个周期。\n注：仅仅适用于测量的频率的信号幅度大于最小二极管管压降上下信号。注意减小该硬件对信号源的影响\n\n\t\u003c...\u003e\n\n\n####傅里叶展开\n对于测量系统，输入一般都是一维实数\n这里FFT运算是将对buffer（实数）进行分析，得到每个频率及对应的幅度.\n原理是将1个N点的时域信号分成N个1点的时域信号，然后计算这N个1点时域信号的频域，得到N个频域的点，然后将这个N个频域的点按照一定的顺序加起来，就得到了需要的频谱。\n标准正弦信号x(t) = Acos(ω。t＋φ) + B =  Acos(2πf*t＋φ) + B,模拟多个不同频率 相位 幅度的信号叠加\n\n\tclear all;\n\tfs = 4000;              % 采样频率\n\tf1 = 50;    f2 = 120;   % 信号频率\n\tA1 = 220;   A2 = 380;   % 信号幅度\n\tDC = 72;                % 直流\n\tn = fs*10;              % 总的采样点数\n\tt = (0:n-1)*(1/fs);     % 时间序列(时间轴)\n\tx =  A1*sqrt(2)*cos(2*pi*f1*t) + A2*sqrt(2)*cos(2*pi*f2*t);\t%产生信号\n\tx = x + 300*randn(size(t));\t\t\t% 混入噪声信号\n\tsubplot(311)\n\tplot(t(1:1000),x(1:1000))\t\t\t%显示前1000个点\n\txlabel('time (S)')\n\tsubplot(312)\n\tplot(t(1:200)*1000,x(1:200))\t\t\t%前200个点\n\txlabel('time (mS)')\n\tN = 2^nextpow2(n);\t\t\t\t% 求得最接近总采样点的2^n,也可以是指定的长度\n\tX = fft(x,N)/n;\t\t\t\t\t% fft变换(除以总点数是为了精确看出原始信号幅值\n\tF = fs/2*(0,N/2);%linspace(0,fs/2,N/2+1);\t% 频率轴(只画到Fs/2即可,y为实数,一半是对称的)\n\tsubplot(313)\t\t\t\t\t% 画出频率幅度图形\n\tplot(F,2*abs(X(1:N/2+1)))\n\txlabel('Frequency (Hz)')\n\tylabel('|Y(f)|')\n\nFFTW库大致是先用fftw_malloc分配输入输出内存，然后输入数据赋值，然后创建变换方案（fftw_plan），然后执行变换（fftw_execute），最后释放资源，还是比较简单的\n使用FFTW库的函数 fftw_plan_dft_r2c_1d()，另逆变换为fftw_plan_dft_c2r_1d()\n还可以针对特殊条件进行优化：固定分析的长度，如1024，将sin cos改成查表法等。再就是利用硬件优势了，如使用汇编，操作寄存器使用硬件DSP等\n\n\t\u003c...\u003e\n\nFFT频域分析\n\n\t\u003c...\u003e\n\n\n####累计\n\u003c...\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsong-react%2Fac-analysis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsong-react%2Fac-analysis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsong-react%2Fac-analysis/lists"}