4.8 IFFT/FFT

article/2025/8/28 1:11:47

4.8.1 IFFT/FFT原理

1. IFFT、FFT在OFDM系统中的应用

2、IFFT/FFT原理

 3、DIT的基2FFT算法

 

 4、DIF的基2FFT运算

 5、基于的频率抽选FFT算法

 

4.8.2 基于 DIF FFT的硬件 结构

1、各级的蝶形运算硬件实现 

 

2、transfer12、 transfer34、transfer56硬件实现

3、transfer23、 transfer45硬件实现

4.8.3 运用IP Core实现IFFT/FFT

 

 

 

 

matlab

matlab:

function [data_out]=ifft_64(data_in,NumCarrier)
%ifft变换
%data_in为经过bpsk,qpsk,QAM16,QAM64星座映射后的复数信号
%NumCarrier为子载波数量,也即ifft变换长度
LengthSymbol=length(data_in)/NumCarrier;
data_out=zeros(1,length(data_in));
%IFFT处理,ifft函数将进行除以NumCarrier,也即64的因子
%根据硬件设计,ifft的系统缩放比例应设为2+3+2-3位为最好,三级蝶形运算,分别右移2/3/2位,然后为了不影响DAC精度,对输入信号放大左移3位
%故我们对ifft进行6-(2+3+2-3)=2,也即乘以4的处理,得到的幅值刚好在-1---1区间//???
for k=1:LengthSymboldata_out((k-1)*NumCarrier+1:k*NumCarrier)=ifft(data_in((k-1)*NumCarrier+1:k*NumCarrier))*4;
end

 暂时不太会用;其实不用看,后来发现变换过程中数据会或多或少丢失,因为matalb采用的是浮点运算,fpga采用的是定点运算测试方案采用:fpgaIFFT变换后的数据,与原数据matlab仿真数据的对比,下面是程序:

时钟模块clk20M-clk60M:

//clk20M-clk60M
module change60(clk20M,clk60M,reset,inEn,outEn,dataInR,dataInI,dataOutR,dataOutI,FFT_set);input clk20M;input clk60M;input reset;input inEn;input [7:0]dataInR;input [7:0]dataInI;output outEn;output [7:0]dataOutR;output [7:0]dataOutI;	 output FFT_set;wire [7:0]dataOutR;wire [7:0]dataOutI;reg [7:0]dataInR_buf;reg [7:0]dataInI_buf;reg  En;wire clk60M;always @(posedge clk20M or negedge reset)beginif(!reset)beginEn<=0;dataInR_buf<=0;dataInI_buf<=0;endelse beginif(inEn)begindataInR_buf<=dataInR;dataInI_buf<=dataInI;		En<=1;					endelse begindataInR_buf<=8'b0;dataInI_buf<=8'b0;En<=0;endendendreg mode;
reg [7:0] k;
//以clk20M的写信号
always @(posedge clk20M or negedge reset)beginif(!reset)begink<=0;endelse beginif(En) beginif(k==63)k<=0;elsek<=k+1;  	  endendendreg [7:0] r;
reg outEn;
reg FFT_set;
reg [7:0] t;//以clk60M的读信号
always @(posedge clk60M or negedge reset)beginif(!reset)begin r<=0;mode<=0;FFT_set<=0;outEn<=0;t<=0;endelse beginif(En)beginif(r==8'b10111010)beginFFT_set<=1;   // output FFT_set 6 clock cycle before dataOut r<=r+1;endelse if(r==8'b10111100)	beginoutEn<=1;   //output outEn 4 clock cycle before dataOutr<=r+1;endelse if(r==8'd191)beginmode<=1;							r<=0;endelse beginr<=r+1;FFT_set<=0;outEn<=0;endendelse r<=0;if(mode)beginif(t==63)begint<=0;mode<=0;endelse t<=t+1;endendend//实部rami ramr (    //BRAM for real part: input 20MHz, output 60MHz, depth 64 bytes.a(k),.dpra(t),.clk(clk20M),.qdpo_clk(clk60M),.d (dataInR_buf),.qdpo(dataOutR),.qdpo_ce(mode),.we(En));//虚部rami rami (    //BRAM for image part: input 20MHz, output 60MHz, depth 64 bytes.a(k),.dpra(t),.clk(clk20M),.qdpo_clk(clk60M),.d (dataInI_buf),.qdpo(dataOutI),.qdpo_ce(mode),.we(En));
endmodule

时钟模块的测试:

 for (j=0;j<=3;j=j+1)begin#200inEn=1;for (i=0;i<64;i=i+1)begin#54dataInR = {$random}%8;dataInI = {$random}%8;   endi=0;inEn=0;endj=0;

时钟模块的波形:

 change_60:

从现在看来完全正确:但是下一级IFFT IP的复位、开始时钟时序不太明白;继续做。。。

 

左移三位,八倍的关系;

先做一下原数据与原数据*3后傅里叶变换的对比:

原数据:实部:0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 7 7 6 6 5 5 4 4 3 3 2 2 1 1 0 0            

                          0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 7 7 6 6 5 5 4 4 3 3 2 2 1 1 0 0

              虚部:0

扩大三倍后输出的数据:

xk_re:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -788 -3 -24 2 -52 -11 -19 -2 -2 -19 -11 -52 2 -24 -3 -788 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

xk_im:0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -239 -2 78 4 -63 -1 16 21 -21 -21 -16 1 63 -4 -78 2 239 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

fft_burst:

module fft_Burst(bitInR,bitInI,inEn,FFT_set,Gclk,rst_n,dv,bitOutR,bitOutI,outEn);  input [7:0] bitInR;
input [7:0] bitInI;
input inEn;
input FFT_set;
input Gclk;
input rst_n;
output [7:0] bitOutR;
output [7:0] bitOutI;
output outEn;
output dv;//
reg [15:0] cnt=0;reg s_axis_config_tvalid;
reg s_axis_data_tvalid;
reg s_axis_data_tlast;
wire m_axis_data_tvalid;
wire s_axis_data_tready;
//wire m_axis_data_tuser;
reg ctrl_we;//
reg start;                        //start ip core, enable for 1 cycle high. 4 cycles before input datareg [15:0] xn_re;					    //input real part register for ip core
reg [15:0] xn_im;					    //input image part register for ip core
reg [7:0] bitOutR;					 //output real part register
reg [7:0] bitOutI;					 //output image part register
reg outEn;						       //synchronize with output, as handshake with next modulereg  [5:0] xn_index;				    //index of input for ip corewire clr;
/
assign clr=rst_n;                //reset of ip core, enable under high level/***************************************************************************/IP时序//
always @(posedge Gclk)beginif(clr)begincnt <= cnt + 1'b1;if(start)     begin     s_axis_data_tvalid  <=1;  cnt <= 0;  endelse if(cnt == 16'd62)begin        s_axis_data_tlast <= 1'b1;                               endelse if(cnt == 16'd63)begins_axis_data_tvalid <= 1'b0;s_axis_data_tlast <= 1'b0;end  end end        
/******************** Set and control FFT  *********************************/always @ (negedge rst_n or posedge Gclk)	
if (!rst_n)                                 //Initialize IP core                                             begin                              start<=1'b0;	ctrl_we<=1'b0;s_axis_config_tvalid<=1'b0;s_axis_data_tvalid <= 0;s_axis_data_tlast <= 0;xn_re<=16'h0000;xn_im<=16'h0000;endelsebeginif (FFT_set)                    //if FFT_set is high, enable all write control signals                  begin							    ctrl_we<=1'b1;	s_axis_config_tvalid <=1'b1; endif (inEn)                       //if inEn is high, enable start and disable all write control signalsbegin      start<=1'b1;ctrl_we<=1'b0;s_axis_config_tvalid <=1'b0;    endelsestart<=1'b0;if (s_axis_data_tvalid)							    //If new data is high, input data.begin    
//        xn_re[10:3]<=bitInR;             //The input of IP core is 16 bit. notice the high bits which indicate sign of data 
//        xn_re[11]<=bitInR[7];
//        xn_re[12]<=bitInR[7];
//        xn_re[13]<=bitInR[7];
//        xn_re[14]<=bitInR[7];
//        xn_re[15]<=bitInR[7];
//        xn_im[10:3]<=bitInI;			//we enlarge the input data by 8 times
//        xn_im[11]<=bitInI[7];
//        xn_im[12]<=bitInI[7];
//        xn_im[13]<=bitInI[7];
//        xn_im[14]<=bitInI[7];
//        xn_im[15]<=bitInI[7];xn_re[7:0]<=bitInR;             //The input of IP core is 16 bit. notice the high bits which indicate sign of data xn_re[8]<=bitInR[7];xn_re[9]<=bitInR[7];xn_re[10]<=bitInR[7];xn_re[11]<=bitInR[7];xn_re[12]<=bitInR[7];xn_re[13]<=bitInR[7];xn_re[14]<=bitInR[7];xn_re[15]<=bitInR[7];xn_im[7:0]<=bitInI;			//we enlarge the input data by 8 timesxn_im[8]<=bitInI[7];xn_im[9]<=bitInI[7];xn_im[10]<=bitInI[7];xn_im[11]<=bitInI[7];xn_im[12]<=bitInI[7];xn_im[13]<=bitInI[7];xn_im[14]<=bitInI[7];xn_im[15]<=bitInI[7];endelsebeginxn_re<=16'h0000;xn_im<=16'h0000;    end   end/********************************************************************/
/********************  FFT ip core  *********************************/
wire [15:0] xk_re;
wire [15:0] xk_im;always @(negedge rst_n or posedge Gclk)beginif(rst_n)beginif(s_axis_data_tvalid)xn_index <= xn_index +1;endend 
/***************************************************************************/
/********************      IFFT output     *********************************/
always @ (negedge rst_n or posedge Gclk)	
if (!rst_n)                                                begin                              outEn<=1'b0;endelsebegin							    if (m_axis_data_tvalid)                         //If dv is enable, output data's lowest 8 bits.begin	  			outEn<=1'b1;   endelsebeginoutEn<=1'b0;endendalways @ (negedge rst_n or posedge Gclk)	
if (!rst_n)                                                begin                              bitOutR<=16'h00;bitOutI<=16'h00;endelsebegin							    if (outEn)                         //If dv is enable, output data's lowest 8 bits.begin	  bitOutR <= xk_re[7:0];bitOutI <= xk_im[7:0];				  endelsebeginbitOutR<=8'h00;bitOutI<=8'h00;endend
fft_text fft_text_inst( .aclk(Gclk),.aresetn(clr),.ctrl_we(ctrl_we),.xn_im(xn_im),.xn_re(xn_re),.s_axis_data_tvalid(s_axis_data_tvalid),.s_axis_data_tlast(s_axis_data_tlast),.s_axis_config_tvalid(s_axis_config_tvalid),.s_axis_data_tready(s_axis_data_tready),.xk_im(xk_im),.xk_re(xk_re),.m_axis_data_tvalid(m_axis_data_tvalid)    );
endmodule

 fft_text:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2018/12/10 17:16:18
// Design Name: 
// Module Name: xfft_64text
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module fft_text( input  aclk,input  aresetn,input [15:0] xn_im,input [15:0] xn_re,input s_axis_data_tvalid,input s_axis_data_tlast,input s_axis_config_tvalid,input ctrl_we,//        output reg [15:0] xn_index,output s_axis_data_tready,output  [15:0]   xk_im,output  [15:0]   xk_re,
//        output [15:0] m_axis_data_tuser,output m_axis_data_tvalid    );reg [7:0] s_axis_config_tdata;wire [31:0] m_axis_data_tdata;wire  [15:0] m_axis_data_tuser;wire    m_axis_data_tlast;     wire    s_axis_config_tready;wire    event_frame_started;wire    event_tlast_unexpected;wire    event_tlast_missing;wire    event_status_channel_halt;wire    event_data_in_channel_halt;wire    event_data_out_channel_halt;wire [31:0] s_axis_data_tdata = {xn_im,xn_re};       assign  {xk_im,xk_re} = m_axis_data_tdata;always @(posedge aclk or negedge aresetn)beginif(!aresetn)begins_axis_config_tdata <= 8'b0;endelsebeginif(ctrl_we)s_axis_config_tdata <= 8'b1011100;endend xfft_64 usr_FFT(.aclk(aclk),.aresetn(aresetn),.s_axis_config_tdata(s_axis_config_tdata),.s_axis_config_tvalid(s_axis_config_tvalid),.s_axis_config_tready(s_axis_config_tready),.s_axis_data_tdata(s_axis_data_tdata),.s_axis_data_tvalid(s_axis_data_tvalid),.s_axis_data_tready(s_axis_data_tready),.s_axis_data_tlast(s_axis_data_tlast),.m_axis_data_tdata(m_axis_data_tdata),.m_axis_data_tuser(m_axis_data_tuser),.m_axis_data_tvalid(m_axis_data_tvalid),.m_axis_data_tready(1'b1),.m_axis_data_tlast(m_axis_data_tlast),.event_frame_started(event_frame_started),.event_tlast_unexpected(event_tlast_unexpected),.event_tlast_missing(event_tlast_missing),.event_status_channel_halt(event_status_channel_halt),.event_data_in_channel_halt(event_data_in_channel_halt),.event_data_out_channel_halt(event_data_out_channel_halt));   endmodule

change20:

//clk60M写clk20M读
module channge20(clk20M,clk60M,reset,inEn,outEn,dataInR,dataInI,dataOutR,dataOutI,bitIndexOut);input clk20M;input clk60M;input reset;input inEn;input [7:0]dataInR;input [7:0]dataInI; output outEn;output [7:0]dataOutR;output [7:0]dataOutI;	output [5:0] bitIndexOut; reg [5:0] bitIndexOut; wire [7:0]dataOutR;wire [7:0]dataOutI;reg [7:0]dataInR_buf;reg [7:0]dataInI_buf;reg En;wire clk60M;always @(posedge clk60M or negedge reset)beginif(!reset)beginEn<=0;dataInR_buf<=0;dataInI_buf<=0;endelse beginif(inEn)begindataInR_buf<=dataInR;dataInI_buf<=dataInI;En<=1;endelse begindataInR_buf<=0;dataInI_buf<=0;En<=0;endendendreg mode;
reg [7:0] k;
//clk60M64涓暟鎹啓鍏?
always @(posedge clk60M or negedge reset)beginif(!reset)begink<=0;endelse beginif(En) beginif(k==63)k<=0;elsek<=k+1;  	  endendend
reg [7:0] r;
reg modetemp;
reg [1:0] cont;
always @(posedge clk60M or negedge reset)beginif(!reset)begin r<=0;modetemp<=0;endelse beginif(En)beginif(r==63)beginmodetemp<=1;r<=0;endelse beginr<=r+1;modetemp<=0;endendelsebeginr<=0;modetemp<=0;endendendalways @(posedge clk60M or negedge reset)beginif(!reset)begin cont<=2'b0;mode<=0;endelsebeginif (cont==2'b11)beginmode<=0;cont<=0;endelse if (modetemp)beginmode<=1;cont<=cont+1;endelse beginif(mode)cont<=cont+1; elsecont<=0;end	       endendreg [7:0] t;
reg outEn;
reg flag;
//clk20M 64涓暟鎹鍙?
always @(posedge clk20M or negedge reset)beginif(!reset)begint<=0;outEn<=0;	flag<=0;endelse beginif(mode)beginflag<=1;endif(flag)beginoutEn<=1;if(t==63)begint<=0;flag<=0;endelse t<=t+1;endelse outEn<=0;endendalways @(posedge clk20M or negedge reset)beginif(!reset)bitIndexOut<=0;elsebitIndexOut<=t;endwire dpo;data_rom dataromr (    //BRAM for real part: input 60MHz, output 20MHz, depth 64 bytes.a(k),.dpra(t),.clk(clk60M),.qdpo_clk(clk20M),.d(dataInR_buf),.qdpo(dataOutR),.qdpo_ce(flag),.we(En),.dpo(dpo));data_rom dataromi (    //BRAM for image part: input 60MHz, output 20MHz, depth 64 bytes.a(k),.dpra(t),.clk(clk60M),.qdpo_clk(clk20M),.d(dataInI_buf),.qdpo(dataOutI),.qdpo_ce(flag),.we(En),.dpo(dpo));endmodule

 matlab仿真验证程序:

clear;file_name='C:/Users/lyw/Desktop/fsave.txt';
fid = fopen(file_name,'r');
c = fscanf(fid,'%d');
fclose(fid);
%有符号数for i=1: length(c)if(c(i)>200)b(i) =  c(i)-256;else b(i) =  c(i);end
end
d1=b(1:2:end);
d2=b(2:2:end);comp1=d1(1:64) + j*d2(1:64);
comp2=d1(65:128) + j*d2(65:128);
%comp2=comp2/3;c1avr=sum(comp1)/length(comp1);
c1=comp1-c1avr;
%  c1=comp1;c1fft=abs(ifft(c1,64));
c2fft=abs(comp2);
plot(c1);
figure
subplot(2,1,1);
plot(c1fft);
subplot(2,1,2);
plot(c2fft);
figure
subplot(2,1,1);
plot(c1fft(1:20));
subplot(2,1,2);
plot(c2fft(1:20));

tb:

 

`timescale 1ns/1ns
module IFFT_tb();reg clk20M;reg clk60M;reg rst_n;reg inEn;reg [7:0] dat_c;wire [7:0]dataInR;wire [7:0]dataInI;wire outEn;wire [7:0]dataOutR;wire [7:0]dataOutI;wire [5:0] bitIndex;IFFT IFFT_inst(.clk20M(clk20M),.clk60M(clk60M),.rst_n(rst_n),.inEn(inEn),.dataInR(dataInR),.dataInI(dataInI),.outEn(outEn),.dataOutR(dataOutR),.dataOutI(dataOutI),.bitIndex(bitIndex));
integer i=0;
integer j=0;integer handle1;initialbegin//sequence block handle1 =$fopen("C:/Users/lyw/Desktop/fsave.txt");       #200000  $fclose(handle1);$stop;end initial beginclk20M=0;clk60M=0;rst_n=0;inEn=0;dat_c = 8'b0;
//    dataInR=8'b00000000;
//    dataInI=8'b00000000;#200rst_n=1;inEn=1;for (i=0;i<64;i=i+1)begin#60dat_c <=(dat_c + 4'b1000);   endinEn=0;
endalways @(posedge clk20M)beginif(inEn)        $fwrite(handle1,"%d %d \n",dataInR,dataInI);  else if(outEn)        $fwrite(handle1,"%d %d \n",dataOutR,dataOutI);        endassign dataInR ={13'b0,{dat_c[7]? ~dat_c[7:4] : dat_c[7:4]}};assign dataInI =0;
always #30 clk20M = ~clk20M;
always #10  clk60M = ~clk60M;
endmodule

在验证过程中出现的问题: 

问题1、设置IP疏忽,未顺序输出;

除了幅度不同,还有感觉是在x方向上缩小了;寻找原因中。。。。。在后续的学习过程中,发现设置IP的时候没有选择顺序输出;

output [7 : 0] m_axis_data_tuser,设置为自动scaling时,该端口表示该次转换的截位(压缩倍数);如果scaling不是自动,那么不会有该信号;该信号在一帧数据的整个时间段内都有效;

问题二:采样时钟问题,部分数据丢失;

笔者发现,单独IP采样周期为20ns,而工程的IP为16ns,可能采样时间太短,造成了数据的丢失,把工程IP的数据改为20ns一周期,发现数据的波形基本一致,幅度上会有差异,下面致力于解决幅值上的差异和第一个转换数据的不准确性; 

问题3:添加outEn,晚m_axis_data_tvalid一个时钟周期有效;

对整个工程进行测试:

发现处理第一个数,所有都正确;此时没有考虑扩大三倍; 幅值fpga大了1.5倍;

等到后面考虑到ADC转换精度的时候在考虑放大倍数的问题;程序控制如下:

此时考虑到三级蝶形运算的放大倍数,设置  s_axis_config_tdata <= 8'b1011100; scale=101110;进行逆运算;

还是要解决第一个数据不对的问题呀。。。。

后面对输出数据延迟一个时钟周期,fpga输出数据与matlab仿真数据完全吻合,幅度扩大了100倍;基本正确! 

总结:fpga IFFT变换输出数据比实际变换后的数据扩大了100倍;(后面根据ADC转换精度决定)输入到IP的数据未经过放大,scale=101110;


http://chatgpt.dhexx.cn/article/3mF2EOm0.shtml

相关文章

Python实现FFT及IFFT

运行环境及编译工具 WindowsVS Code 编程语言及库版本 库版本Python3.7.0copy无numpy1.19.2opencv3.4.2PIL8.1.0matplotlib3.4.3 可执行文件 HW_2.pyHW_2.ipynb在HW_2.ipynb中执行&#xff0c;详细程序信息在HW_2.py中 问题 1 通过计算一维傅里叶变换实现图像二维快速傅里…

matlab FFT 和IFFT

代码&#xff1a; fs100;N128; n0:N-1;tn/fs; xsin(2*pi*40*t)sin(2*pi*15*t); subplot(221);plot(n,x,b); xlabel(时间/s);ylabel(x);title(原始信号); grid on;yfft(x,N); magabs(y); fn*fs/N; subplot(222);plot(f(1:N/2),mag(1:N/2)*2/N,b); xlabel(频率/Hz);ylabel(振幅)…

基于vivado实现FFT/IFFT

文章目录 前言一、基本过程二、vivado配置1.新建工程2.调用DDS的IP核2.调用FFT的IP核 三、编写Verilog程序1.顶层文件fft.v2.仿真文件fft_tb.v 四、运行仿真1. 运行仿真设置2. 仿真波形设置3. 结果分析 前言 使用vivado2018.3实现FFT&#xff0f;IFFT&#xff0c;过程比较详细…

python fft ifft

文章目录 条件代码实例 条件 任何一个满足狄利克雷条件的函数都可以通过傅里叶基数展开。 numpy和scipy中都有fft变换&#xff0c;且效果都是一样的。 代码 import numpy as np from scipy.fftpack import fft,ifft import matplotlib.pyplot as plt from matplotlib.pylab …

FFT专题:IFFT后信号如何重建

ifft(outFFTData, g_fft_temp, inFFTData, g_twiddle_ifft, twiddle_stride, F_WLEN);//思考ifft输出的复数结果怎么给到硬件输出 之前一直关注FFT后信号奔赴到频域处理,那么频域处理完后,怎么重建信号呢? 给出一段FFT和IFFT函数源码 int nFrameRunCount 0;#pragma section…

数字信号处理基础(二):FFT和IFFT的使用以及详细分析代码书写思路

目录 1. fft和ifft的原理1.1 fft1.2 ifft 2. 书写代码思路3. 完整代码4. 结果图 1. fft和ifft的原理 1.1 fft fft是快速傅里叶变换&#xff0c;是MATLAB中计算信号频谱的函数&#xff0c;使用方法是fft(x)&#xff0c;直接对信号x进行fft计算。 由于fft函数计算信号的频谱是0…

信号处理中的反傅里叶变换(IFFT)原理

信号处理中&#xff0c;经常需要将信号转换到频域进行分析&#xff0c;有时候还会从频域转回时域&#xff0c;用到FFT和IFFT函数。 FFT变换是将信号从时域转换到频域&#xff0c;在时域看起来复杂的信号转换到频域看起来就方便容易了很多。但有时候也需要将频域信号转换到时域…

adb下载、安装、环境配置

一&#xff1a;adb安装 adb下载链接&#xff1a;https://pan.baidu.com/s/1Vd6KyZ6vT2Qtmhazwre4OQ 提取码&#xff1a;3dx1 安装&#xff1a; 1.双击adb.exe文件&#xff0c;并运行。 2.添加环境变量&#xff1a; 右击计算机–属性—高级系统设置—高级—环境变量—新建&…

windows下载安装adb(极其简单)

单独安装adb&#xff0c;不安装sdk 下载adb Google很好的心&#xff0c;直接放出ADB的档案供人下载。下档路径如下&#xff1a; Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本&#xff1a;https://dl.google…

ADB-adb命令安装app

下载adb 安装adb 将名称中含有adb的文件&#xff0c;和fastboot.exe复制到 c:/windows/system32目录将名称中含有adb的所有文件复制到 c:/windows/system目录将adb.exe和AdbWinApi.dll复制到c:/windows/SysWoW64目录 有线安装apk 连接上数据线&#xff0c;然后把手机开发者模…

adb详细教程(一)-下载安装与环境变量配置

对于Android开发来说&#xff0c;adb是再熟悉不过的调试工具 但其实对于移动端的测试来说&#xff0c;adb也是一个十分重要的、能够提高测试工作效率的工具。 文章目录 一、介绍二、下载地址三、安装四、配置环境变量 一、介绍 全称 adb全称全称为Android Debug Bridge&#x…

mac下载安装adb环境

目录 方法一1、下载安装包2、下载完成后进行解压&#xff0c;目录路径注意不得包含中文3、配置环境变量4、验证安装是否成功 方法二1、安装homebrew2、安装adb3、运行adb 方法一 1、下载安装包 安装包下载地址 &#xff1a;https://developer.android.com/studio/releases/pl…

adb工具下载安装

一、adb环境配置 adb即Android Debug Bridge&#xff0c;就是可以通过窗口命令&#xff0c;使在pc端可以调试安卓移动端的一个工具包 我这里是默认电脑已经安装SDK的&#xff0c;如果没有也没关系&#xff0c;直接网上下载一个adb工具包一样的https://developer.android.goo…

adb环境配置

adb环境配置 1.下载工具包 工具包&#xff1a;platform-tools_r30.0.4-windows.zip 获取途径1&#xff1a;链接: https://pan.baidu.com/s/17BiARFlgsQa2wDETmoJIvQ?pwddsd2 提取码: dsd2 获取途径2&#xff1a;https://developer.android.google.cn/studio/releases/plat…

android adb驱动官方下载,adb驱动下载

这里给你简单的介绍一下adb驱动:adb驱动就是电脑与android设备的通信的客户端驱动程序。使用它可以直接操作管理android模拟器或者真实的andriod设备。 adb驱动百科介绍: Android设备(如手机)连接PC时所需要的驱动程序,一般Android设备连接WinXP是无需安装驱动的。 adb的全称…

windows ——adb下载与安装

一、adb下载 链接&#xff1a;https://pan.baidu.com/s/1D3eOkHsuAnZd6WoFEVC7xQ 提取码&#xff1a;sc94 二、adb安装 双击 adb-setup-1.3.exe 安装 可以查看此安装教程[转载]&#xff1a;http://m.mz6.net/detail/4506-13.html 三、adb安装成功验证 键盘快捷键&#xff1a;Wi…

adb下载安装教程(已安装Android studio)

adb下载安装教程&#xff08;已安装Android studio&#xff09; ①找到adb.exe的绝对路径如下&#xff1a; ②将绝对路径放入环境变量path中&#xff08;绝对路径不带入adb.exe&#xff09; 右击“此电脑”>“属性”>”高级系统设置“>”环境变量“>”path“ 双…

ADB下载及常用命令

ADB&#xff0c;即 Android Debug Bridge&#xff0c;它是 Android 开发/测试人员不可替代的强大工具 文章目录 预先准备adb的平台工具软件包下载配置环境变量 连接设备确认连接状态\查询已连设备USB 连接无线连接&#xff08;Android11 及以上&#xff09; 应用管理查看应用列…

ADB 下载地址

adbshell 点击ADBkit下载

mac os adb下载

一 adb安装&#xff1a; 打开终端&#xff0c;输入命令 1.安装homebrew&#xff1a; 方式一&#xff1a;ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 方式二&#xff1a;/bin/zsh -c "$(curl -fsSL https:/…