fft(matlab)3

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;
            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
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值