fft(matlab)3
时间:2022-08-18 01:30:00
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