主頁 >  其他 > ADPCM(自適應差分脈沖編碼調制)的原理和計算

ADPCM(自適應差分脈沖編碼調制)的原理和計算

2022-11-23 07:21:52 其他

關于ADPCM

ADPCM(Adaptive Differential Pulse Code Modulation, 自適應差分脈沖編碼調制) 是一種音頻信號數字化編碼技術, 音頻壓縮標準G.722, G.723, G.726 中都會使用到 ADPCM

G.722 is an ITU-T standard 7 kHz wideband audio codec operating at 48, 56 and 64 kbit/s. It was approved by ITU-T in November 1988. Technology of the codec is based on sub-band ADPCM (SB-ADPCM). The corresponding narrow-band codec based on the same technology is G.726.[1]

G.723 is an ITU-T standard speech codec using extensions of G.721 providing voice quality covering 300 Hz to 3400 Hz using Adaptive Differential Pulse Code Modulation (ADPCM) to 24 and 40 kbit/s for digital circuit multiplication equipment (DCME) applications.

G.726 is an ITU-T ADPCM speech codec standard covering the transmission of voice at rates of 16, 24, 32, and 40 kbit/s. It was introduced to supersede both G.721, which covered ADPCM at 32 kbit/s, and G.723, which described ADPCM for 24 and 40 kbit/s. G.726 also introduced a new 16 kbit/s rate. The four bit rates associated with G.726 are often referred to by the bit size of a sample, which are 2, 3, 4, and 5-bits respectively. The corresponding wide-band codec based on the same technology is G.722.

要了解ADPCM, 需要先了解PCM和DPCM.

PCM, Pulse Code Modulation, 脈沖編碼調制

PCM 是聲音模擬信號數字化的一種基礎技術, 就是把時間連續取值連續的模擬信號變換成離散取值的數字信號, 熟悉ADC(模擬數字轉換)的應該很好理解, 程序就是采樣, 量化和編碼.

1. 采樣

用固定的頻率, 對模擬信號提取樣本值, 人耳能夠感覺到的最高頻率為20kHz, 根據奈奎斯特采樣定律, Nyquist rate, 只需要每秒進行40k次采樣, 就能覆寫人耳的聽覺范圍, 也就是說采樣高于40k每秒對于普通人來說, 聽徑訓本上沒有提升了.

In signal processing, the Nyquist rate, named after Harry Nyquist, is a value (in units of samples per second or hertz, Hz) equal to twice the highest frequency (bandwidth) of a given function or signal. When the function is digitized at a higher sample rate (see § Critical frequency), the resulting discrete-time sequence is said to be free of the distortion known as aliasing. Conversely, for a given sample-rate the corresponding Nyquist frequency in Hz is one-half the sample-rate. Note that the Nyquist rate is a property of a continuous-time signal, whereas Nyquist frequency is a property of a discrete-time system.

人類語音的頻率在300 - 3000 Hz之間, 成年男性的語音基頻在85-155Hz, 女性在165-255Hz, 同時會產生豐富的諧振頻率, 在通信上, 需要保證 300 - 3400Hz 的頻率范圍才能滿足正常通話, 對于這個頻率范圍, 需要使用 8K每秒的采樣率. 通常電話的采樣率為8k和16kHz.

The voiced speech of a typical adult male will have a fundamental frequency from 85 to 155 Hz, and that of a typical adult female from 165 to 255 Hz.[3] Thus, the fundamental frequency of most speech falls below the bottom of the voice frequency band as defined. However, enough of the harmonic series will be present for the missing fundamental to create the impression of hearing the fundamental tone.

日常音頻信號常見的采樣率為8K, 16k, 22.05k, 32k, 44.1k, 48k, 192k. 常見的無線電廣播最高采樣率為22.05K, CD最高采樣率為44.1k, DVD最高采樣率為48k, Hi-Res音頻采樣率可以高達192k.

2. 量化和編碼

量化和編碼就是把采樣得到的信號幅度轉換成數字值(ADC), 再組織成固定尺寸的序列. PCM實際上就是一個大陣列, 陣列中每個值, 代表了當前時間點上的模擬量強度, 在播放時在對應的時間點上被轉換為模擬量輸出(DAC).

在量化的程序中會產生誤差, 一般而言, ADC的精度越高, 失真越小. 常見的量化位數為8bit, 16bit, 24bit. 模數轉換都會有誤差和底噪, 對于ADC而言, 除了精度, 還有轉換的實作方式, 電壓基準, 電磁環境等都會對轉換效果造成影響.

DPCM, Differential Pulse Code Modulation, 差分脈沖編碼調制

PCM 保存的是最原始的模數轉換結果, 是不壓縮的, 資料量比較大, 存盤和通訊都會占用很大資源, 需要將資料壓縮以減少通信帶寬和存盤的資源消耗.

將音頻PCM的陣列展開觀察可以看到, 資料值與相鄰的值通常是比較連續的, 不會突然很高或者突然很低, 兩點之間差值不會太大, 所以這個差值可以用很少的幾個位(比如4bit)表示. 這樣只需要知道起始點的值和每個點的差值, 就可以還原得到原來的序列. 記錄的差值序列就是DPCM資料, 這樣資料量會小很多.

以8k采樣率為例, 如果量化精度為16bit, 則1秒的資料量為8000 * 16 bit = 128kb, 如果用4bit的表示差值, 則1秒的 PCM 資料轉成 DPCM 只需要約 32kb.

ADPCM, Adaptive Differential Pulse Code Modulation, 自適應差分脈沖編碼調

DPCM存在一個問題, 音頻信號雖然比較連續性, 但是存在差值較大的情況, 例如差值超過4bit表示的范圍(-15, 15) 就無法很好還原原來的PCM序列, 這時候如果增大差值寬度, 例如用6bit, 8bit表示, 可以減小這個問題, 但資料量也增大了.

ADPCM 的出發點就是解決 DPCM 的差值寬度問題, 通過定義一個差值表(例如IMA ADPCM 中使用 89個固定差值, 取值從7到32767), 將差值的范圍放寬到16bit, 此時差值在陣列中的編號只需要6bit就可以表示(0 - 88), 再進一步只記錄編號的變化值, 就將變化量壓縮到了4bit.

ADPCM演算法是一個統稱, 有 YAMAHA, Microsoft, IMA 等標準, 下面以嵌入式開發中最常見的 IMA ADPCM 為例進行說明

IMA ADPCM 編碼

在了解編解碼演算法前, 先了解 IMA ADPCM 的編碼格式.

16bit的 IMA ADPCM 編碼產生的資料為一個陣列, 陣列中每個數都是4個bit(值范圍為0x00到0x0F), 因為C語言編程中變數的最小單位是byte, 所以通常表示為 uint8_t 陣列, 陣列中每個元素存盤2個 ADPCM 編碼值, 或者對于32位系統使用 uint32_t, 每個元素存盤8個 ADPCM 編碼值.

對于IMA ADPCM, 還需要了解兩個碼表, 一個是差值步長碼表, 一個是差值步長下標變化量碼表

  • 差值步長碼表: 下標從0到88, 共89個值, 從小到大, 非均勻分布, 下標越大, 值之間的間隔越大, 這個碼表的具體計算方式不清楚, 通過多次項擬合需要至少4次方到5次方才能擬合.
  • 差值步長下標變化量碼表: 下標從-7到7, ADPCM 佇列中每個值可以通過這個直接查表得到下一個值的差值步長的下標變化量, 進而得到下一個值的差值步長. 值在 [-3, 3] 之間的, 變化都是-1, 也就是差值步長變小, 在[-4,-7]和[4,7]的, 變化是2,4,6,8, 可以看到對于-7和7, 差值步長會快速增大.

IMA ADPCM的編碼格式說明

知道了 ADPCM 編碼值的格式, 也知道了兩個碼表, 就可以了解 ADPCM 編碼值中各個bit位的作用.

例如一個編碼值為0x05, 對應二進制0101, 其中最高位為0, 代表變化為正, 輸出值是在前一個值上疊加; 低三位為5, 代表差值步長下標變化量為+4, 也就是差值步長變大了, 另外第三位的每一位分別代表對應實際差值的差值步長的倍數, 參與了差值的計算

bit位 含義
4 0 最高位代表了正負, 如果是0, 代表這個差值是正的, 1則表示差值是負的
3 1 1-3bit合起來代表了下一個值的差值步長下標變化量, 同時每個bit代表當前步長的一個系數, 這個bit表示1倍差值步長
2 0 這個bit表示0.5倍差值步長
1 1 這個bit表示0.25倍差值步長

以上會產生 1 + 0 + 0.25 = 1.25倍的差值步長, 加上固定的1/8步長, 就是說這一步產生的輸出 = 前一步數值 + 當前差值步長 * 1.375, 這個值會作為下一步的數值, 同時下一步的差值步長下標+4, 也就是下一個值的計算中用到的差值步長增大了.

IMA ADPCM 的編解碼例子

輸入序列為

uint16_t nums[12] = {0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0050, 0x0050, 0x0040, 0x0400, 0x0400, 0x0400, 0x0400};

使用 IMA ADPCM 對上面的序列進行編碼, 每一步的記錄, 第一列為輸入, 最后一列為輸出

  • 初始: 0x0000,
  • 輸入: 0x0010, 步長下標0x00, 步長0x0007, 前采樣值0x0000, 輸出: 編碼0x7
  • 輸入: 0x0020, 步長下標0x08, 步長0x0010, 前采樣值0x000B, 輸出: 編碼0x5
  • 輸入: 0x0030, 步長下標0x0C, 步長0x0017, 前采樣值0x0021, 輸出: 編碼0x2
  • 輸入: 0x0040, 步長下標0x0B, 步長0x0015, 前采樣值0x002E, 輸出: 編碼0x3
  • 輸入: 0x0050, 步長下標0x0A, 步長0x0013, 前采樣值0x003F, 輸出: 編碼0x3
  • 輸入: 0x0050, 步長下標0x09, 步長0x0011, 前采樣值0x004E, 輸出: 編碼0x0
  • 輸入: 0x0050, 步長下標0x08, 步長0x0010, 前采樣值0x0050, 輸出: 編碼0x0
  • 輸入: 0x0040, 步長下標0x07, 步長0x000E, 前采樣值0x0052, 輸出: 編碼0xD
  • 輸入: 0x0400, 步長下標0x0B, 步長0x0015, 前采樣值0x0040, 輸出: 編碼0x7
  • 輸入: 0x0400, 步長下標0x13, 步長0x002D, 前采樣值0x0066, 輸出: 編碼0x7
  • 輸入: 0x0400, 步長下標0x1B, 步長0x0061, 前采樣值0x00B9, 輸出: 編碼0x7
  • 輸入: 0x0400, 步長下標0x23, 步長0x00D1, 前采樣值0x016E, 輸出: 編碼0x7

解碼輸出的序列為

# 解碼結果
0x000B, 0x0021, 0x002E, 0x003F, 0x004E, 0x0050, 0x0052, 0x0040, 0x0066, 0x00B9, 0x016E, 0x02F5
# 作為參照的原輸入序列
0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0050, 0x0050, 0x0040, 0x0400, 0x0400, 0x0400, 0x0400

通過觀察可以得到幾個規律

  1. 解碼還原的結果, 就是編碼程序中每一次產生的presample
  2. 每一次的code, 查表得到偏移量, 疊加在當前的index上, 產生下一個index, 而index又決定了step大小
  3. step的大小并不會直接影響下一個presample, 而是會跟code進行計算, 最多1.875個step, 最少0.125個step
    1. code 第四位(高) -- 決定正負
    2. code 第三位 -- 一個step
    3. code 第二位 -- 1/2個step
    4. code 第一位(低) -- 1/4個step
    5. 不管以上何值, 都會帶一個1/8 step 的變化
  4. 如果code大于4或小于-4, 說明差值大于一個步長, 步長需要增大, 這個規則體現在了差值步長下標變化量碼表

IMA ADPCM 的代碼分析

碼表

/* 差值步長碼表 */
const uint16_t StepSizeTable[89]={7,8,9,10,11,12,13,14,16,17,
                            19,21,23,25,28,31,34,37,41,45,
                            50,55,60,66,73,80,88,97,107,118,
                            130,143,157,173,190,209,230,253,279,307,
                            337,371,408,449,494,544,598,658,724,796,
                            876,963,1060,1166,1282,1411,1552,1707,1878,2066,
                            2272,2499,2749,3024,3327,3660,4026,4428,4871,5358,
                            5894,6484,7132,7845,8630,9493,10442,11487,12635,13899,
                            15289,16818,18500,20350,22385,24623,27086,29794,32767};
/* 差值步長下標變化量碼表 */
const int8_t IndexTable[16]={0xff,0xff,0xff,0xff,2,4,6,8,0xff,0xff,0xff,0xff,2,4,6,8};

編碼函式

熟悉前面的格式和編解碼邏輯, 下面的代碼就比較好理解了. 函式輸入是一個16bit數字, 輸出一個4bit數字, 中間用兩個static變數, 用于存盤前一步確定的差值步長下標, 以及前一次的解碼值, 參與下一個值的編碼計算

uint8_t ADPCM_Encode(int32_t sample)
{
  // index 存盤的是上一次預測的差值步長下標, 通過查表可以得到步長
  static int16_t  index = 0;
  // predsample 存盤的是上一個解碼值, 解碼還原時產生的就是這個值
  static int32_t predsample = 0;
  // 當前輸入值, 編碼后的輸出, 4個bit
  uint8_t code=0;
  uint16_t tmpstep=0;
  int32_t diff=0;
  int32_t diffq=0;
  uint16_t step=0;
  
  // 先拿到差值步長
  step = StepSizeTable[index];

  // 看看當前輸入值, 跟上一個輸出值的差值
  diff = sample-predsample;
  // 如果是負的, 就給code 的高4位置1, 表示差值是負數
  if (diff < 0)  
  {
    code=8;
    diff = -diff;
  }    
  
  tmpstep = step;

  // 以下根據差值, 計算步長的乘數系數(同時就會產生步長下標的偏移量)
  // 首先是固定的 1/8個step
  diffq = (step >> 3);

  // 下面就是按位進行除法, 每一位的結果被依次賦值到code的3,2,1位, 同時presample的值也算出來了
  if (diff >= tmpstep)
  {
    code |= 0x04;
    diff -= tmpstep;
    diffq += step;
  }
  
  tmpstep = tmpstep >> 1;

  if (diff >= tmpstep)
  {
    code |= 0x02;
    diff -= tmpstep;
    diffq+=(step >> 1);
  }
  
  tmpstep = tmpstep >> 1;
  
  if (diff >= tmpstep)
  {
    code |=0x01;
    diffq+=(step >> 2);
  }
  // 到這一步, 如果code值大于等于4或小于等于-4, 就說明差值大于當前的步長(至少是1.125倍), 步長要增加, 否則步長要收縮

  // 以下都是避免值越界的一些計算
  if (code & 8)
  {
    predsample -= diffq;
  }
  else
  {
    predsample += diffq;
  }  

  if (predsample > 32767)
  {
    predsample = 32767;
  }
  else if (predsample < -32768)
  {
    predsample = -32768;
  }
  
  // 查表得到下一個數的差值步長下標
  index += IndexTable[code];
  // 避免越界
  if (index <0)
  {
    index = 0;
  }
  else if (index > 88)
  {
    index = 88;
  }
  
  // 避免越界
  return (code & 0x0f);
}

解碼函式

解碼就是將ADPCM陣列中的每個4bit數值, 還原回編碼程序中的每個presample值.

/**
  * @brief  ADPCM_Decode.
  * @param code: a byte containing a 4-bit ADPCM sample. 
  * @retval : 16-bit ADPCM sample
  */
int16_t ADPCM_Decode(uint8_t code)
{
  // 上一步預測的差值步長下標
  static int16_t  index = 0;
  // 上一步的解碼值
  static int32_t predsample = 0;
  uint16_t step=0;
  int32_t diffq=0;
  
  // 得到當前步長
  step = StepSizeTable[index];

  // 根據步長和4bit編碼值, 計算當前的實際差值

  // 先是1/8的固定差值
  diffq = step>> 3;

  // 第3位, 1倍步長
  if (code&4)
  {
    diffq += step;
  }
  // 第2位, 0.5倍步長
  if (code&2)
  {
    diffq += step>>1;
  }
  // 第1位, 0.25倍步長
  if (code&1)
  {
    diffq += step>>2;
  }

  // 根據正負符號, 加或者減, 算出解碼結果
  if (code&8)
  {
    predsample -= diffq;
  }
  else
  {
    predsample += diffq;
  }
  
  // 防止越界
  if (predsample > 32767)
  {
    predsample = 32767;
  }
  else if (predsample < -32768)
  {
    predsample = -32768;
  }

  // 查表, 計算得到下一個差值步長的下標
  index += IndexTable [code];
  // 防止越界
  if (index < 0)
  {
    index = 0;
  }
  if (index > 88)
  {
    index = 88;
  }
  
  // 回傳解碼結果
  return ((int16_t)predsample);
}

總結

以上說明了ADPCM的原理, 以及通過對 IMA ADPCM 編碼代碼的分析, 了解 ADPCM 的具體實作. ADPCM的優點是計算簡單, 對CPU和存盤資源的損耗很小, 以及可觀的壓縮比(接近4:1), 編解碼延時最短(相對其它技術), 缺點是有損壓縮, 音質不算好, 壓縮率也不算高. 因為對硬體要求低, 適用于低成本低功耗的嵌入式硬體. 對于資源不受限, 有高音質需求, 或者有更高壓縮比需求的場景, 可以使用其它的編碼演算法, 例如LPCM, AAC, MP3等.

參考

  • https://wiki.multimedia.cx/index.php/IMA_ADPCM
  • IMA ADPCM 設計規范 A scanned, OCR'ed copy of the original IMA/DVI ADPCM specification document http://www.cs.columbia.edu/~hgs/audio/dvi/IMA_ADPCM.pdf 原始掃描件 http://www.cs.columbia.edu/~hgs/audio/dvi/

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538038.html

標籤:其他

上一篇:資料結構基礎—樹與二叉樹(2)

下一篇:DP經典例題——LIS&LCS

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more