clc clear all fs=1*10^6; f=50*10^3; N=260;
L=1000; t=0:L-1; t=t/fs;
s=sin(2*pi*f*t);
a=abs((fft(s,N))); subplot(211); plot(t(1:100)*1000,s(1:100)); xlabel('时间(ms)'); ylabel('幅度(v)');
subplot(212) n=0:N-1; stem(n,a); xlabel('FFT位置; ylabel('FFT变换模块;
clc clear all fs=1*10^6; f1=50*10^3; f2=39.0625*10^3; N=260;
L=1000; t=0:L-1; t=t/fs;
s=sin(2*pi*f1*t) sin(2*pi*f2*t);
a=abs(fft(s,N));
subplot(211) plot(t(1:100)*1000,s(1:100)); xlabel('时间(ms)');ylabel('幅度(v)'); legend时域波形(频率叠加信号);
subplot(212) n=0:N-1; stem(n,a); xlabel('fft位置');ylabel('fft变换模块; legend频域波形(频率叠加信号);
f1=2; f2=2.05; fs=10;
N=128; n=0:N-1; xn1=sin(2*pi*f1*n/fs) sin(2*pi*f2*n/fs);
a=fft(xn1); a1=abs(a(1:N/2));
M=512; xn2=[xn1 zeros(1,M-N)]; b=fft(xn2); b1=abs(b(1:M/2));
n=0:M-1; xn3=sin(2*pi*f1*n/fs) sin(2*pi*f2*n/fs); c=fft(xn3); c1=abs(c(1:M/2));
subplot(321); x1=0:N-1; plot(x1,xn1);xlabel('n','fontsize',8);title('128点x(n)','fontsize',8); subplot(322); k1=(0:N/2-1)*fs/N; plot(k1,a1);xlabel('f(Hz)','fontsize',8);title('128点x(n)的fft','fontsize',8); subplot(323); x2=0:M-1; plot(x2,xn2);xlabel('n','fontsize',8);title(512点补零x(n)','fontsize',8); subplot(324); k2=(0:M/2-1)*fs/M; plot(k2,b1);xlabel('f(Hz)','fontsize',8);title(512点补零x(n)fft','fontsize',8); subplot(325); plot(x2,xn3);xlabel('n','fontsize',8);title('512点的x(n)','fontsize',8); subplot(326); plot(k2,c1);xlabel('f(Hz)','fontsize',8);title('512点的x(n)fft','fontsize',8);
fs=50*10^6; f1=1*10^6; f2=2*10^6; f3=3*10^6;
N=512; t=0:1/fs:511/fs; s1=sin(2*pi*f1*t); s2=sin(2*pi*f2*t); s3=sin(2*pi*f3*t); s=s1 s2 s3; a=abs(fft(s1,N)); a1=abs(fft(s2,N)); a2=abs(fft(s3,N)); a3=abs(fft(s,N)); subplot(411) plot(a); title('1mHz信号频谱'); subplot(412) plot(a1); title('2mHz信号频谱'); subplot(413) plot(a2); title('3mHz信号频谱');
subplot(414) plot(a3); title(合成信号频谱); s=s/max(abs(s)); da=round(s*127); L=8; fid=fopen('d:\data.txt','w'); for i=1:length(da) da1=dec2bin(da(i) (da(i)<0)*2^L,L) for j=1:L if da1(j)=='1' tb=1; else tb=0; end fprintf(fid,'%d',tb); end fprintf(fid,'\r\n'); end fprintf(fid,':'); fclose(fid);
dn=[100,zeros(1,511)];
plot(abs(fft(dn))); N=8; fid=fopen('d:\data.txt','w'); for i=1:length(dn) da1=dec2bin(dn(i) (dn(i)<0)*2^N,N) for j=1:N if da1(j)=='1' tb=1; else tb=0; end fprintf(fid,'%d',tb); end fprintf(fid,'\r\n'); end fprintf(fid,':'); fclose(fid);
4.
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 08:53:12 05/10/2021 // Design Name: // Module Name: fftm // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module fftm( input clk, input start, output div, //dv成功 output [7:0]xk ///输出谱线位置 ); wire dv,rfd,done,busy,edone; wire [8:0]xk_index; wire [8:0] xn_index; wire [17:0] xk_im ; wire [7:0] sine; wire signed [17:0] dout; &nsp; ddsm u0 ( .clk(clk), // input clk .we(1'b1), // input we .data(16'd1311), // input [15 : 0] data .sine(sine) // output [7 : 0] sine );
mfft u1( .clk(clk), // input clk .start(start), // input start .unload(1'b1), // input unload .xn_re(sine), // input [7 : 0] xn_re .xn_im(8'd0), // input [7 : 0] xn_im .fwd_inv(1'b1), // input fwd_inv .fwd_inv_we(1'b1), // input fwd_inv_we .rfd(rfd), // output rfd .xn_index(xn_index), // output [8 : 0] xn_index .busy(busy), // output busy .edone(edone), // output edone .done(done), // output done .dv(dv), // output dv .xk_index(xk_index), // output [8 : 0] xk_index .xk_re(dout), // output [17 : 0] xk_re .xk_im(xk_im) // output [17 : 0] xk_im );
reg ce=0;
always@(posedge clk) if(xk_index==256) ce<=1; assign div=ce;
reg signed [21:0] data_max=0; reg [8:0] n=0; reg [8:0] p=0; always@(posedge clk) if((dv==1)&&(xk_index<256)) begin if(dout>data_max) begin data_max<=dout; n<=xk_index; end end else begin p<=n; end assign xk=p;
6.
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 18:55:32 05/11/2021 // Design Name: // Module Name: signed_detect // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module signed_detect( input clk, input [7:0]rx_data, output ce, output reg [7:0] tx_data ); reg [30:0] cnt3=0; reg clk9600hz=0; always@(posedge clk ) if(cnt3==2603/*50*/) begin clk9600hz<=~clk9600hz; cnt3<=0; end else cnt3<=cnt3+1; reg ce=0; always@(posedge clk9600hz) if((rx_data==8'haa)&&(div)) ce<=1; else ce<=0;
reg [15:0]cn4=0; reg [4:0]s=0; always@(posedge clk9600hz) begin if (cn4<9599) cn4<=cn4+1; else if (cn4==9599) begin cn4<=0; s<=s+1; end end always@(*) case(s) 1:tx_data<=f1; 2:tx_data<=f2; 3:tx_data<=f3; 4:tx_data<=pow1[7:0]; 5:tx_data<=pow1[15:8]; 6:tx_data<=pow1[23:16]; 7:tx_data<=pow1[31:24]; 8:tx_data<=pow1[35:32]; 9:tx_data<=pow2[7:0]; 10:tx_data<=pow2[15:8]; 11:tx_data<=pow2[23:16]; 12:tx_data<=pow2[31:24]; 13:tx_data<=pow2[35:32]; 14:tx_data<=pow3[7:0]; 15:tx_data<=pow3[15:8]; 16:tx_data<=pow3[23:16]; 17:tx_data<=pow3[31:24]; 18:tx_data<=pow3[35:32]; default:tx_data<=8'hbb; endcase reg [7:0] f1; reg [7:0]f2; reg [7:0] f3; reg [35:0] pow1; reg [35:0] pow2; reg [35:0] pow3; reg div; wire [8:0]xk_index; wire signed [17:0]xk_re,xk_im; wire[35:0]xk_rsq,xk_isq,power2; reg[35:0]power3,power4; reg dv1,dv2; reg[8:0]xk_index1; wire signed [7:0] xn; wire signed [5:0]sine,sine1,sine2; dds1 ua ( .clk(clk), // input clk .we(1'b1), // input we .data(16'd1311), // input [15 : 0] data .sine(sine) // output [5 : 0] sine ); dds1 ub ( .clk(clk), // input clk .we(1'b1), // input we .data(16'd2323), // input [15 : 0] data .sine(sine1) // output [5 : 0] sine ); dds1 uc ( .clk(clk), // input clk .we(1'b1), // input we .data(16'd3933), // input [15 : 0] data .sine(sine2) // output [5 : 0] sine ); assign xn=sine-sine1-sine2; //例化512点FFT核 fft512 u1 ( .clk(clk), // input clk .start(1'b1), // input start .unload(1'b1), // input unload .xn_re(xn), // input [7 : 0] xn_re .xn_im(8'd0), // input [7 : 0] xn_im .fwd_inv(1'b1), // input fwd_inv .fwd_inv_we(1'b1), // input fwd_inv_we .rfd(rfd), // output rfd .xn_index(xn_index), // output [8 : 0] xn_index .busy(busy), // output busy .edone(edone), // output edone .done(done), // output done .dv(dv), // output dv .xk_index(xk_index), // output [8 : 0] xk_index .xk_re(xk_re), // output [17 : 0] xk_re .xk_im(xk_im) // output [17 : 0] xk_im ); //计算谱线的功率,乘法运算二级流水 mult18 u2 ( .clk(clk), // input clk .a(xk_re), // input [17 : 0] a .b(xk_re), // input [17 : 0] b .p(xk_rsq) // output [35 : 0] p ); mult18 u3 ( .clk(clk), // input clk .a(xk_im), // input [17 : 0] a .b(xk_im), // input [17 : 0] b .p(xk_isq) // output [35 : 0] p ); assign power2=xk_rsq+xk_isq; reg [8:0]xk_0; reg dv_0; always@(posedge clk) begin xk_0<=xk_index; dv_0<=dv; end always@(posedge clk) begin dv1<=dv_0; // dv2<=dv1; power3<=power2; power4<=power3; xk_index1<=xk_0; // xk_index2<=xk_index1; end reg [7:0] ft1; reg [7:0] ft2; reg [7:0] ft3; reg [35:0]powt1; reg [35:0] powt2; reg [35:0] powt3;
reg [1:0] cnt=0; always@(posedge clk) //FFT变换完成,只判断正频率部分谱线 if((dv1)&(xk_index1<9'd256))begin //判断是否出现波峰,且幅度大于0.03v的谱线 if((power3>power2)&(power3>power4)&(power3>36'd951327)) begin if(cnt==0) begin ft1<=xk_index1; powt1<=power3; cnt<=cnt+1; end if(cnt==1) begin ft2<=xk_index1; powt2<=power3; cnt<=cnt+1; end if(cnt==2) begin ft3<=xk_index1; powt3<=power3; cnt<=3; end end end else begin cnt<=0; ft1<=0; ft2<=0; ft3<=0; powt1<=0; powt2<=0; powt3<=0; end always@(posedge clk) if(xk_index1==256) begin f1<=ft1; f2<=ft2; f3<=ft3; pow1<=powt1; pow2<=powt2; pow3<=powt3; end always@(posedge clk) if(cnt>0) div<=1'b1; else div<=0; endmodule