主頁 > 軟體設計 > 【STM32F407的DSP教程】第37章 STM32F407的FIR低通濾波器實作(支持逐個資料的實時濾波)

【STM32F407的DSP教程】第37章 STM32F407的FIR低通濾波器實作(支持逐個資料的實時濾波)

2021-08-07 08:36:15 軟體設計

完整版教程下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

第37章 STM32F407的FIR低通濾波器實作(支持逐個資料的實時濾波)

本章節講解FIR低通濾波器實作,

目錄

37.1 初學者重要提示

37.2 低通濾波器介紹

37.3 FIR濾波器介紹

37.4 Matlab工具箱filterDesinger生成低通濾波器C頭檔案

37.5 FIR低通濾波器設計

37.5.1 函式arm_fir_init_f32

37.5.2 函式arm_fir_f32

37.5.3 filterDesigner獲取低通濾波器系數

37.5.4 低通濾波器實作

37.6 實驗例程說明(MDK)

37.7 實驗例程說明(IAR)

37.8 總結


37.1 初學者重要提示

1、 本章節提供的低通濾波器支持實時濾波,每次可以濾波一個資料,也可以多個資料,不限制大小,但要注意以下兩點:

  • 所有資料是在同一個采樣率下依次采集的資料,
  • 每次過濾資料個數一旦固定下來,運行中不可再修改,

2、 FIR濾波器的群延遲是一個重要的知識點,詳情在本教程第41章有詳細說明,

37.2 低通濾波器介紹

允許低頻信號通過,而減弱高于截止頻率的信號通過,比如混合信號含有50Hz + 200Hz信號,我們可通過低通濾波器,過濾掉200Hz信號,讓50Hz信號通過,

37.3 FIR濾波器介紹

ARM官方提供的FIR庫支持Q7,Q15,Q31和浮點四種資料型別,其中Q15和Q31提供了快速演算法版本,

FIR濾波器的基本演算法是一種乘法-累加(MAC)運行,輸出運算式如下:

y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]

結構圖如下:

這種網路結構就是在35.2.1小節所講的直接型結構,

37.4 Matlab工具箱filterDesinger生成低通濾波器C頭檔案

下面我們講解下如何通過filterDesigner工具生成C頭檔案,也就是生成濾波器系數,首先在matlab的命視窗輸入filterDesigner就能打開這個工具箱:

filterDesigner界面打開效果如下:

FIR濾波器的低通,高通,帶通,帶阻濾波的設定會在后面逐個講解,這里重點介紹設定后相應引數后如何生成濾波器系數,引數設定好以后點擊如下按鈕:

點擊Design Filter按鈕以后就生成了所需的濾波器系數,生成濾波器系數以后點擊filterDesigner界面上的選單Targets->Generate C header ,打開后顯示如下界面:

然后點擊Generate,生成如下界面:

再點擊保存,并打開fdatool.h檔案,可以看到生成的系數:

/*
 * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
 * Generated by MATLAB(R) 9.4 and Signal Processing Toolbox 8.0.
 * Generated on: 20-Jul-2021 12:19:30
 */

/*
 * Discrete-Time FIR Filter (real)
 * -------------------------------
 * Filter Structure  : Direct-Form FIR
 * Filter Length     : 51
 * Stable            : Yes
 * Linear Phase      : Yes (Type 1)
 */

/* General type conversion for MATLAB generated C-code  */
#include "tmwtypes.h"
/* 
 * Expected path to tmwtypes.h 
 * D:\Program Files\MATLAB\R2018a\extern\include\tmwtypes.h 
 */
/*
 * Warning - Filter coefficients were truncated to fit specified data type.  
 *   The resulting response may not match generated theoretical response.
 *   Use the Filter Design & Analysis Tool to design accurate
 *   single-precision filter coefficients.
 */
const int BL = 51;
const real32_T B[51] = {
  -0.0009190982091, -0.00271769613,-0.002486952813, 0.003661438357,   0.0136509249,
    0.01735116541,  0.00766530633,-0.006554719061,-0.007696784101, 0.006105459295,
    0.01387391612,0.0003508617228, -0.01690892503,-0.008905642666,  0.01744112931,
    0.02074504457,  -0.0122964941, -0.03424086422,-0.001034529647,  0.04779030383,
    0.02736303769, -0.05937951803, -0.08230702579,  0.06718690693,   0.3100151718,
     0.4300478697,   0.3100151718,  0.06718690693, -0.08230702579, -0.05937951803,
    0.02736303769,  0.04779030383,-0.001034529647, -0.03424086422,  -0.0122964941,
    0.02074504457,  0.01744112931,-0.008905642666, -0.01690892503,0.0003508617228,
    0.01387391612, 0.006105459295,-0.007696784101,-0.006554719061,  0.00766530633,
    0.01735116541,   0.0136509249, 0.003661438357,-0.002486952813, -0.00271769613,
  -0.0009190982091
};

上面陣列B[51]中的資料就是濾波器系數,下面小節講解如何使用filterDesigner配置FIR低通,高通,帶通和帶阻濾波,關于Filter Designer的其它用法,大家可以在matlab命令視窗中輸入help filterDesigner打開幫助檔案進行學習,

37.5 FIR低通濾波器設計

本章使用的FIR濾波器函式是arm_fir_f32,使用此函式可以設計FIR低通,高通,帶通和帶阻

濾波器,

37.5.1 函式arm_fir_init_f32

函式原型:

void arm_fir_init_f32(
        arm_fir_instance_f32 * S,
        uint16_t numTaps,
  const float32_t * pCoeffs,
        float32_t * pState,
        uint32_t blockSize);

函式描述:

這個函式用于FIR初始化,

函式引數:

  • 第1個引數是arm_fir_instance_f32型別結構體變數,
  • 第2個引數是濾波器系數的個數,
  • 第3個引數是濾波器系數地址,
  • 第4個引數是緩沖狀態地址,
  • 第5個引數是每次處理的資料個數,最小可以每次處理1個資料,最大可以每次全部處理完,

注意事項:

結構體arm_fir_instance_f32的定義如下(在檔案arm_math.h檔案):

  typedef struct
  {
    uint16_t numTaps;     /**< number of filter coefficients in the filter. */
float32_t *pState;      /**< points to the state variable array. The array is of length */
 numTaps+blockSize-1. 
    float32_t *pCoeffs;    /**< points to the coefficient array. The array is of length numTaps. */
  } arm_fir_instance_f32;

1、引數pCoeffs指向濾波因數,濾波因數陣列長度為numTaps,但要注意pCoeffs指向的濾波因數應該按照如下的逆序進行排列:

{b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}

但滿足線性相位特性的FIR濾波器具有奇對稱或者偶對稱的系數,偶對稱時逆序排列還是他本身,

2、pState指向狀態變數陣列,這個陣列用于函式內部計算資料的快取,

3、blockSize 這個引數的大小沒有特殊要求,最小可以每次處理1個資料,最大可以每次全部處理完,

37.5.2 函式arm_fir_f32

函式原型:

void arm_fir_f32(
const arm_fir_instance_f32 * S,
const float32_t * pSrc,
float32_t * pDst,
uint32_t blockSize)

函式描述:

這個函式用于FIR濾波,

函式引數:

  • 第1個引數是arm_fir_instance_f32型別結構體變數,
  • 第2個引數是源資料地址,
  • 第3個引數是濾波后的資料地址,
  • 第4個引數是每次呼叫處理的資料個數,最小可以每次處理1個資料,最大可以每次全部處理完,

37.5.3 filterDesigner獲取低通濾波器系數

設計一個如下的例子:

信號由50Hz正弦波和200Hz正弦波組成,采樣率1Kbps,現設計一個低通濾波器,截止頻率125Hz,采樣1024個資料,采用函式fir1進行設計(注意這個函式是基于視窗的方法設計FIR濾波,默認是hamming窗),濾波器階數設定為28,filterDesigner的配置如下:

配置好低通濾波器后,具體濾波器系數的生成大家參考本章第4小節的方法即可,

37.5.4 低通濾波器實作

通過工具箱filterDesigner獲得低通濾波器系數后在開發板上運行函式arm_fir_f32 來測驗低通濾波器的效果,

#define TEST_LENGTH_SAMPLES  1024    /* 采樣點數 */
#define BLOCK_SIZE           1         /* 呼叫一次arm_fir_f32處理的采樣點個數 */
#define NUM_TAPS             29      /* 濾波器系數個數 */

uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;            /* 需要呼叫arm_fir_f32的次數 */

static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采樣點 */
static float32_t testOutput[TEST_LENGTH_SAMPLES];               /* 濾波后的輸出 */
static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];        /* 狀態快取,大小numTaps + blockSize - 1*/


/* 低通濾波器系數 通過fadtool獲取*/
const float32_t firCoeffs32LP[NUM_TAPS] = {
  -0.001822523074f,  -0.001587929321f,  1.226008847e-18f,  0.003697750857f,  0.008075430058f,
  0.008530221879f,   -4.273456581e-18f, -0.01739769801f,   -0.03414586186f,  -0.03335915506f,
  8.073562366e-18f,  0.06763084233f,    0.1522061825f,     0.2229246944f,    0.2504960895f,
  0.2229246944f,     0.1522061825f,     0.06763084233f,    8.073562366e-18f, -0.03335915506f,
  -0.03414586186f,   -0.01739769801f,   -4.273456581e-18f, 0.008530221879f,  0.008075430058f,
  0.003697750857f,   1.226008847e-18f,  -0.001587929321f,  -0.001822523074f
};


/*
*********************************************************************************************************
*    函 數 名: arm_fir_f32_lp
*    功能說明: 呼叫函式arm_fir_f32_lp實作低通濾波器
*    形    參:無
*    返 回 值: 無
*********************************************************************************************************
*/
static void arm_fir_f32_lp(void)
{
    uint32_t i;
    arm_fir_instance_f32 S;
    float32_t  *inputF32, *outputF32;

    /* 初始化輸入輸出快取指標 */
    inputF32 = &testInput_f32_50Hz_200Hz[0];
    outputF32 = &testOutput[0];

    /* 初始化結構體S */
    arm_fir_init_f32(&S,                            
                     NUM_TAPS, 
                    (float32_t *)&firCoeffs32LP[0], 
                     &firStateF32[0], 
                     blockSize);

    /* 實作FIR濾波,這里每次處理1個點 */
    for(i=0; i < numBlocks; i++)
    {
        arm_fir_f32(&S, inputF32 + (i * blockSize),  outputF32 + (i * blockSize),  blockSize);
    }
    

    /* 列印濾波后結果 */
    for(i=0; i<TEST_LENGTH_SAMPLES; i++)
    {
        printf("%f, %f\r\n", testOutput[i], inputF32[i]);
    }

}

運行如上函式可以通過串口列印出函式arm_fir_f32濾波后的波形資料,下面通過Matlab繪制波形來對比Matlab計算的結果和ARM官方庫計算的結果,

對比前需要先將串口列印出的一組資料加載到Matlab中, arm_fir_f32的計算結果起名sampledata,加載方法在第13章13.6小結已經講解,這里不做贅述了,Matlab中運行的代碼如下:

%****************************************************************************************
%                             FIR低通濾波器設計
%***************************************************************************************
fs=1000;               %設定采樣頻率 1K
N=1024;                %采樣點數      
n=0:N-1;
t=n/fs;                 %時間序列
f=n*fs/N;               %頻率序列

x=sin(2*pi*50*t)+sin(2*pi*200*t);     %50Hz和200Hz正弦波混合
b=fir1(28, 0.25);
y=filter(b, 1, x);
subplot(211);
plot(t, y);
title('Matlab FIR濾波后的波形');
grid on;

subplot(212);
plot(t, sampledata);
title('ARM官方庫濾波后的波形');
grid on;

Matlab運行結果如下:

從上面的波形對比來看,matlab和函式arm_fir_f32計算的結果基本是一致的,為了更好的說明濾波效果,下面從頻域的角度來說明這個問題,Matlab上面運行如下代碼:

%****************************************************************************************
%                             FIR低通濾波器設計
%***************************************************************************************
fs=1000;                    %設定采樣頻率 1K
N=1024;                      %采樣點數      
n=0:N-1;
t=n/fs;                      %時間序列
f=n*fs/N;                    %頻率序列

x = sin(2*pi*50*t) + sin(2*pi*200*t);      %50Hz和200Hz正弦波合成

subplot(221);
plot(t, x);   %繪制信號Mix_Signal的波形                                                 
xlabel('時間');
ylabel('幅值');
title('原始信號');
grid on;
  
subplot(222);
y=fft(x, N);     %對信號 Mix_Signal做FFT   
plot(f,abs(y));
xlabel('頻率/Hz');
ylabel('振幅');
title('原始信號FFT');
grid on;

y3=fft(sampledata, N);            %經過FIR濾波器后得到的信號做FFT
subplot(223);                               
plot(f,abs(y3));
xlabel('頻率/Hz');
ylabel('振幅');
title('濾波后信號FFT');
grid on;

b=fir1(28, 0.25);          %28階FIR低通濾波器,截止頻率125Hz
[H,F]=freqz(b,1,512);      %通過fir1設計的FIR系統的頻率回應
subplot(224);
plot(F/pi,abs(H));          %繪制幅頻回應
xlabel('歸一化頻率');        
title(['Order=',int2str(30)]);
grid on;

Matlab顯示效果如下:

上面波形變換前的FFT和變換后FFT可以看出,200Hz的正弦波基本被濾除,

37.6 實驗例程說明(MDK)

配套例子:

V5-225_FIR低通濾波器設計(支持逐個資料的實時濾波)

實驗目的:

  1. 學習FIR低通濾波器的實作,支持實時濾波

實驗內容:

  1. 啟動一個自動重裝軟體定時器,每100ms翻轉一次LED2,
  2. 按下按鍵K1,列印原始波形資料和濾波后的波形資料,

使用AC6注意事項

特別注意附件章節C的問題

上電后串口列印的資訊:

波特率 115200,資料位 8,奇偶校驗位無,停止位 1,

RTT方式列印資訊:

程式設計:

系統堆疊大小分配:

硬體外設初始化

硬體外設的初始化是在 bsp.c 檔案實作:

/*
*********************************************************************************************************
*    函 數 名: bsp_Init
*    功能說明: 初始化所有的硬體設備,該函式配置CPU暫存器和外設的暫存器并初始化一些全域變數,只需要呼叫一次
*    形    參:無
*    返 回 值: 無
*********************************************************************************************************
*/
void bsp_Init(void)
{
    /* 
       STM32F407 HAL 庫初始化,此時系統用的還是F407自帶的16MHz,HSI時鐘:
       - 呼叫函式HAL_InitTick,初始化滴答時鐘中斷1ms,
       - 設定NVIC優先級分組為4,
     */
    HAL_Init();

    /* 
       配置系統時鐘到168MHz
       - 切換使用HSE,
       - 此函式會更新全域變數SystemCoreClock,并重新配置HAL_InitTick,
    */
    SystemClock_Config();

    /* 
       Event Recorder:
       - 可用于代碼執行時間測量,MDK5.25及其以上版本才支持,IAR不支持,
       - 默認不開啟,如果要使能此選項,務必看V5開發板用戶手冊第8章
    */    
#if Enable_EventRecorder == 1  
    /* 初始化EventRecorder并開啟 */
    EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();
#endif
    
    bsp_InitKey();        /* 按鍵初始化,要放在滴答定時器之前,因為按鈕檢測是通過滴答定時器掃描 */
    bsp_InitTimer();      /* 初始化滴答定時器 */
    bsp_InitUart();    /* 初始化串口 */
    bsp_InitLed();        /* 初始化LED */        
}

主功能:

主程式實作如下操作:

  • 啟動一個自動重裝軟體定時器,每100ms翻轉一次LED2,
  • 按下按鍵K1,列印原始波形資料和濾波后的波形資料,
/*
*********************************************************************************************************
*    函 數 名: main
*    功能說明: c程式入口
*    形    參: 無
*    返 回 值: 錯誤代碼(無需處理)
*********************************************************************************************************
*/
int main(void)
{
    uint8_t ucKeyCode;        /* 按鍵代碼 */
    uint16_t i;

    
    bsp_Init();        /* 硬體初始化 */
    PrintfLogo();    /* 列印例程資訊到串口1 */

    PrintfHelp();    /* 列印操作提示資訊 */
    
    for(i=0; i<TEST_LENGTH_SAMPLES; i++)
    {
        /* 50Hz正弦波+200Hz正弦波,采樣率1KHz */
        testInput_f32_50Hz_200Hz[i] = arm_sin_f32(2*3.1415926f*50*i/1000) + 
arm_sin_f32(2*3.1415926f*200*i/1000);
    }
    

    bsp_StartAutoTimer(0, 100);    /* 啟動1個100ms的自動重裝的定時器 */

    /* 進入主程式回圈體 */
    while (1)
    {
        bsp_Idle();        /* 這個函式在bsp.c檔案,用戶可以修改這個函式實作CPU休眠和喂狗 */
        

        if (bsp_CheckTimer(0))    /* 判斷定時器超時時間 */
        {
            /* 每隔100ms 進來一次 */
            bsp_LedToggle(2);    /* 翻轉LED的狀態 */
        }
        
        ucKeyCode = bsp_GetKey();    /* 讀取鍵值, 無鍵按下時回傳 KEY_NONE = 0 */
        if (ucKeyCode != KEY_NONE)
        {
            switch (ucKeyCode)
            {
                case KEY_DOWN_K1:            /* K1鍵按下 */
                    arm_fir_f32_lp();
                    break;
                
    
                default:
                    /* 其它的鍵值不處理 */
                    break;
            }
        }

    }
}

37.7 實驗例程說明(IAR)

配套例子:

V5-225_FIR低通濾波器設計(支持逐個資料的實時濾波)

實驗目的:

  1. 學習FIR低通濾波器的實作,支持實時濾波

實驗內容:

  1. 啟動一個自動重裝軟體定時器,每100ms翻轉一次LED2,
  2. 按下按鍵K1,列印原始波形資料和濾波后的波形資料,

上電后串口列印的資訊:

波特率 115200,資料位 8,奇偶校驗位無,停止位 1,

RTT方式列印資訊:

程式設計:

系統堆疊大小分配:

硬體外設初始化

硬體外設的初始化是在 bsp.c 檔案實作:

/*
*********************************************************************************************************
*    函 數 名: bsp_Init
*    功能說明: 初始化所有的硬體設備,該函式配置CPU暫存器和外設的暫存器并初始化一些全域變數,只需要呼叫一次
*    形    參:無
*    返 回 值: 無
*********************************************************************************************************
*/
void bsp_Init(void)
{
    /* 
       STM32F407 HAL 庫初始化,此時系統用的還是F407自帶的16MHz,HSI時鐘:
       - 呼叫函式HAL_InitTick,初始化滴答時鐘中斷1ms,
       - 設定NVIC優先級分組為4,
     */
    HAL_Init();

    /* 
       配置系統時鐘到168MHz
       - 切換使用HSE,
       - 此函式會更新全域變數SystemCoreClock,并重新配置HAL_InitTick,
    */
    SystemClock_Config();

    /* 
       Event Recorder:
       - 可用于代碼執行時間測量,MDK5.25及其以上版本才支持,IAR不支持,
       - 默認不開啟,如果要使能此選項,務必看V5開發板用戶手冊第8章
    */    
#if Enable_EventRecorder == 1  
    /* 初始化EventRecorder并開啟 */
    EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();
#endif
    
    bsp_InitKey();        /* 按鍵初始化,要放在滴答定時器之前,因為按鈕檢測是通過滴答定時器掃描 */
    bsp_InitTimer();      /* 初始化滴答定時器 */
    bsp_InitUart();    /* 初始化串口 */
    bsp_InitLed();        /* 初始化LED */        
}

主功能:

主程式實作如下操作:

  • 啟動一個自動重裝軟體定時器,每100ms翻轉一次LED2,
  • 按下按鍵K1,列印原始波形資料和濾波后的波形資料,
/*
*********************************************************************************************************
*    函 數 名: main
*    功能說明: c程式入口
*    形    參: 無
*    返 回 值: 錯誤代碼(無需處理)
*********************************************************************************************************
*/
int main(void)
{
    uint8_t ucKeyCode;        /* 按鍵代碼 */
    uint16_t i;

    
    bsp_Init();        /* 硬體初始化 */
    PrintfLogo();    /* 列印例程資訊到串口1 */

    PrintfHelp();    /* 列印操作提示資訊 */
    
    for(i=0; i<TEST_LENGTH_SAMPLES; i++)
    {
        /* 50Hz正弦波+200Hz正弦波,采樣率1KHz */
        testInput_f32_50Hz_200Hz[i] = arm_sin_f32(2*3.1415926f*50*i/1000) + 
arm_sin_f32(2*3.1415926f*200*i/1000);
    }
    

    bsp_StartAutoTimer(0, 100);    /* 啟動1個100ms的自動重裝的定時器 */

    /* 進入主程式回圈體 */
    while (1)
    {
        bsp_Idle();        /* 這個函式在bsp.c檔案,用戶可以修改這個函式實作CPU休眠和喂狗 */
        

        if (bsp_CheckTimer(0))    /* 判斷定時器超時時間 */
        {
            /* 每隔100ms 進來一次 */
            bsp_LedToggle(2);    /* 翻轉LED的狀態 */
        }
        
        ucKeyCode = bsp_GetKey();    /* 讀取鍵值, 無鍵按下時回傳 KEY_NONE = 0 */
        if (ucKeyCode != KEY_NONE)
        {
            switch (ucKeyCode)
            {
                case KEY_DOWN_K1:            /* K1鍵按下 */
                    arm_fir_f32_lp();
                    break;
                
    
                default:
                    /* 其它的鍵值不處理 */
                    break;
            }
        }

    }
}

37.8 總結

本章節主要講解了FIR濾波器的低通實作,同時一定要注意線性相位FIR濾波器的群延遲問題,詳見本教程的第41章,

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

標籤:其他

上一篇:【C語言實作】最大公約數的3種求法

下一篇:人類高質量男性不好當?那就來寫人類高質量代碼!

標籤雲
其他(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)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more