你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱——DSP教程】第18章 ComplexMathFunctions的使用(二)

[复制链接]
baiyongbin2009 发布时间:2015-3-30 10:57
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接7 Z3 _+ T4 z5 s$ j
第18章 ComplexMathFunctions的使用(二)

, u- [- |  K9 C8 ?# P
    本期教程主要讲解复数运算中的模平方,复数乘法和复数乘实数的求解。
    18.1 复数模平方 ComplexMagSquared
    18.2 复数乘法 ComplexMultComplex
    18.3 复数乘实数 ComplexMultComplex
    18.4 总结
" O& h3 S2 N) k5 b
18.1 复数模平方 ComplexMagSquared18.1.1 arm_cmplx_mag_squared_f32
公式描述:
    for(n=0; n<numSamples; n++) {        
            pDst[n] = pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2;        
     }  
函数定义如下:
    void arm_cmplx_mag_squared_f32(float32_t * pSrc, float32_t * pDst, uint32_t numSamples)
参数定义:
    [in]  *pSrc   points to the complex input vector        
    [out]  *pDst  points to the real output vector        
    [in]  numSamples  number of complex samples in the input vector  
注意事项:
    1. 数组pSrc和pDst中存储的数据格式是(实部,虚部,实部,虚部……………)
# [$ Y$ W- G, Q: u. @- v. n
18.1.2 arm_cmplx_mag_squared_q31
公式描述:
    for(n=0; n<numSamples; n++) {        
            pDst[n] = pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2;        
     }  
函数定义如下:
    void arm_cmplx_mag_squared_q31(q31_t * pSrc, q31_t * pDst, uint32_t numSamples)
参数定义:
    [in]  *pSrc   points to the complex input vector        
    [out]  *pDst  points to the real output vector        
    [in]  numSamples  number of complex samples in the input vector  
注意事项:
    1. 数组pSrc和pDst中存储的数据格式是(实部,虚部,实部,虚部……………)
! K. [8 N& ^" U7 L9 `1 {
18.1.3 arm_cmplx_mag_squared_q15
公式描述:
    for(n=0; n<numSamples; n++) {        
            pDst[n] = pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2;        
     }  
函数定义如下:
    void arm_cmplx_mag_squared_q15(q15_t * pSrc, q15_t * pDst, uint32_t numSamples)
参数定义:
    [in]  *pSrc   points to the complex input vector        
    [out]  *pDst  points to the real output vector        
    [in]  numSamples  number of complex samples in the input vector  
注意事项:
    1. 数组pSrc和pDst中存储的数据格式是(实部,虚部,实部,虚部……………)
( h$ I1 b/ ]* b9 X
18.1.4 实例讲解
实验目的:
     1. 学习ComplexMathFunctions中模平方的求解
实验内容:
    1. 按下按键K1, 串口打印函数DSP_MagSquared的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
18.1.jpg
程序设计:
  1. /*1 r+ }; L* u; h4 O# M: ~3 M
  2. *********************************************************************************************************% Z  y8 v6 Z# B# M! K! v8 q
  3. *        函 数 名: DSP_MagSquared
    - e8 V6 d- R; H9 l) \8 I# k& G
  4. *        功能说明: 复数模的平方
    / D% x5 n: b  d* t( e
  5. *        形    参:无
    7 u$ x; O" Y( G4 d; c. W
  6. *        返 回 值: 无8 r! k) w9 Q4 g0 ~% s
  7. *********************************************************************************************************
    $ m  a$ F  z1 ?) t
  8. */
    . b* p: c, b+ v" B9 i  A
  9. static void DSP_MagSquared(void)
    + G! y1 H- y/ b
  10. {
    9 r0 S7 D0 o8 q9 _+ n
  11. uint8_t i;
    7 R  @# H5 Y7 X$ m
  12. float32_t pSrc[10] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f, 5.1f};
    ) e+ p3 ~! Q% W; _! s
  13. float32_t pDst[10];/ r( e+ F2 h0 Y# m. y  P& W
  14. q31_t pSrc1[10] = {1*268435456, 1*268435456, 2*268435456, 2*268435456, 3*268435456, 3*268435456,
    - k3 m# N! \3 v
  15.                     4*268435456, 4*268435456, 5*268435456, 5*268435456};
    5 h' K5 f- A8 U3 Y3 m
  16. q31_t pDst1[10];; S) K- N; b, G9 e  `8 o6 I4 x( P

  17. . ^& C5 p+ s6 e8 x) w- R& H
  18. q15_t pSrc2[10] = {5000, 10000, 15000, 20000, 25000,  5000, 10000, 15000, 20000, 25000};
    7 a$ g! d5 I$ M3 c0 w" D" E
  19. q15_t pDst2[10];6 Y) m- Z; B) I- Q
  20. /***浮点数模平方*******************************************************************************/
    - e+ S3 D( V# R- [5 |
  21. arm_cmplx_mag_squared_f32(pSrc, pDst, 5);* M+ m9 @+ R! J8 N
  22. for(i = 0; i < 5; i++)! t$ q1 C" ~. H- s- s& A7 D6 j3 v
  23. {
    % e/ T  N% `5 G7 u( Y& T) {
  24. printf("pDst[%d] = %f\r\n", i, pDst[i]);" R* q4 O% h1 h
  25. }' `% d1 W2 @/ X: e  d/ `% t! h3 N9 X
  26. /***定点数模平方Q31*******************************************************************************/
      O8 W2 e% }  O8 I4 Z. Z+ ~
  27. arm_cmplx_mag_squared_q31(pSrc1, pDst1, 5);
    % f# s5 y  A0 G0 c1 y1 \6 F
  28. for(i = 0; i < 5; i++)
    2 C. |: X+ R, @; J
  29. {7 J- b; W) s) D# ]/ D' I6 A
  30. printf("pDst1[%d] = %d\r\n", i, pDst1[i]);! \5 |; {5 t  r& L6 I( X
  31. }
    ! @3 k" G' m! Z& P9 i* z
  32. /***定点数模平方Q15*******************************************************************************/- w0 T" a3 W3 S3 S  s0 V8 q
  33. arm_cmplx_mag_squared_q15(pSrc2, pDst2, 5);! y2 H- x) w: {8 q  i) \
  34. for(i = 0; i < 5; i++)+ _$ m9 w8 q! E) u
  35. {
    9 o$ I& I7 O. G1 i
  36. printf("pDst2[%d] = %d\r\n", i, pDst2[i]);' o  O$ E3 f& z0 w' I1 a+ r
  37. }# O" |" j  i! s% w$ i
  38. }
复制代码

' R4 D: Y( H3 m& j" Y& ]6 Y. }
赞 收藏 评论5 发布时间:2015-3-30 10:57

举报

5个回答
baiyongbin2009 回答时间:2015-3-30 11:00:44
18.2 复数乘法 ComplexMultComplex6 X4 s! o* d9 _( d9 X6 V# W
; K7 j* o7 w/ l5 I; n! C7 D
18.2.1 arm_cmplx_mult_cmplx_f32
公式描述:
    for(n=0; n<numSamples; n++) {        
            pDst[(2*n)+0] = pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];        
            pDst[(2*n)+1] = pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];        
    }  
函数定义如下:
    void arm_cmplx_mult_cmplx_f32(
      float32_t * pSrcA,
         float32_t * pSrcB,
        float32_t * pDst,
        uint32_t numSamples)
参数定义:
    [in]  *pSrcA   points to the first input vector        
    [in]  *pSrcB   points to the second input vector        
    [out]  *pDst   points to the output vector        
    [in]  numSamples number of complex samples in each vector   
注意事项:
    1. 数组pSrcA, pSrcB和pDst中存储的数据格式是(实部,虚部,实部,虚部……………)

9 `( x$ x" w3 v. r
18.2.2 arm_ cmplx_mult_cmplx_q31
公式描述:
    for(n=0; n<numSamples; n++) {        
            pDst[(2*n)+0] = pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];        
            pDst[(2*n)+1] = pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];        
    }
函数定义如下:
    void arm_cmplx_mult_cmplx_q31(
        q31_t * pSrcA,
        q31_t * pSrcB,
        q31_t * pDst,
        uint32_t numSamples)
参数定义:
    [in]  *pSrc   points to the complex input vector        
    [out]  *pDst  points to the real output vector        
    [in]  numSamples  number of complex samples in the input vector  
注意事项:
    1. 数组pSrcA, pSrcB和pDst中存储的数据格式是(实部,虚部,实部,虚部……………)
! y& P# Z/ b# m  v: z8 p; |
18.2.3 arm_cmplx_mult_cmplx_q15
公式描述:
    for(n=0; n<numSamples; n++) {        
            pDst[(2*n)+0] = pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];        
            pDst[(2*n)+1] = pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];        
    }   
函数定义如下:
    void arm_cmplx_mult_cmplx_q15(
        q15_t * pSrcA,
        q15_t * pSrcB,
        q15_t * pDst,
        uint32_t numSamples)
参数定义:
    [in]  *pSrc   points to the complex input vector        
    [out]  *pDst  points to the real output vector        
    [in]  numSamples  number of complex samples in the input vector  
注意事项:
    1. 数组pSrcA, pSrcB和pDst中存储的数据格式是(实部,虚部,实部,虚部……………)

- e' g. ]+ F/ p' O7 M0 O

; e( y/ x; u4 k. z- w& d) ^18.2.4
实例讲解
实验目的:
    1. 学习ComplexMathFunctions中复数乘法的求解
实验内容:
    1. 按下按键K2, 串口打印函数DSP_CmplxMult的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
18.2.jpg
程序设计:
  1. /*
    , P1 c4 p9 k6 ^
  2. *********************************************************************************************************
    + `4 B. t6 x8 ?# U9 l
  3. *        函 数 名: DSP_CmplxMult
    , n+ ?% A. P9 T, I3 A% m/ l; J) f
  4. *        功能说明: 复数乘法; `, E/ ]. w) V6 ]# L9 M
  5. *        形    参:无
    4 l$ [6 M$ X: S( D5 A
  6. *        返 回 值: 无
    : C* h1 ?' i% O1 q, Q) B3 H
  7. *********************************************************************************************************
      X8 D% Y: H+ b7 S
  8. */% S3 F2 X; n5 _# r
  9. static void DSP_CmplxMult(void)' {5 u+ t0 m6 Q. F
  10. {4 H: k. e* C9 J
  11. uint8_t i;7 T+ b0 B. Z5 Q# u: x0 r1 X
  12. float32_t pSrcA[10] = {1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f};8 m8 R/ I, [' Z- T5 z( O
  13. float32_t pSrcB[10] = {1.2f, 1.2f, 2.2f, 2.2f, 3.2f, 3.2f, 4.2f, 4.2f, 5.2f, 5.2f};. n% @: V& X) x9 R
  14. float32_t pDst[10];
    ( f; Y' n+ D+ n, Z6 P
  15. q31_t pSrcA1[10] = {1*268435456, 1*268435456, 2*268435456, 2*268435456, 3*268435456, 3*268435456, & S8 ]( _7 v$ n9 V4 O" S
  16.                     4*268435456, 4*268435456, 5*268435456, 5*268435456};% N! v% v: G3 x$ n9 l3 A
  17. q31_t pSrcB1[10] = {1*268435456, 1*268435456, 2*268435456, 2*268435456, 3*268435456, 3*268435456,
    ' N* p9 l9 P' X. q9 e/ Z6 ~' g, W
  18.                     4*268435456, 4*268435456, 5*268435456, 5*268435456};( a5 z0 F5 s/ e- d/ u
  19. q31_t pDst1[10];7 v3 x% t6 r( N. @
  20. q15_t pSrcA2[10] = {5000, 10000, 15000, 20000, 25000,  5000, 10000, 15000, 20000, 25000};" |/ I2 f- J( B  [: d
  21. q15_t pSrcB2[10] = {6000, 11000, 15000, 20000, 25000,  5000, 10000, 15000, 20000, 25000};
    9 p8 r) ]+ G- B2 m4 K9 |
  22. q15_t pDst2[10];" n" \0 H2 G0 o7 F+ h
  23. /***浮点数乘法*******************************************************************************/
    + m4 a1 x- @) [
  24. arm_cmplx_mult_cmplx_f32(pSrcA, pSrcB, pDst, 5);0 u$ z- _4 C9 q6 g
  25. for(i = 0; i < 5; i++)' r$ |+ d9 K# d/ f2 ?8 c; R
  26. {
    - B" E5 a4 U2 s' _1 C
  27. printf("pDst[%d] = %f %fj\r\n", i, pDst[2*i], pDst[2*i+1]);
    1 N2 l  X& y/ z$ a
  28. }
    * ~) \. D) D' a/ b5 G) U1 m
  29. /***定点数乘法Q31*******************************************************************************/3 k5 P4 n6 v# ?( j
  30. arm_cmplx_mult_cmplx_q31(pSrcA1, pSrcB1, pDst1, 5);4 r# ]& ~' P9 ?- K
  31. for(i = 0; i < 5; i++)- ?: z1 U" L! c4 M% H4 H6 l2 R
  32. {7 j+ R. ?- f# E- k4 z
  33. printf("pDst1[%d] = %d %dj\r\n", i, pDst1[2*i], pDst1[2*i+1]);
    ) A. r' Z" {6 x% Y
  34. }4 s1 c% [1 p2 C" d
  35. /***定点数乘法Q15*******************************************************************************/1 q, E1 H6 v3 d% {2 x8 r( V
  36. arm_cmplx_mult_cmplx_q15(pSrcA2, pSrcB2, pDst2, 5);
    , M5 ]$ M4 i3 t. V5 [
  37. for(i = 0; i < 5; i++)
    8 s1 L! y7 b) k7 N
  38. {8 F5 M* T. d+ b( r( z) [
  39. printf("pDst1[%d] = %d %dj\r\n", i, pDst2[2*i], pDst2[2*i+1]);! k7 y1 Z) h' W. F" {* Q
  40. }7 D  B4 Z: p) C+ C( M( |5 g
  41. }
复制代码
' i5 ]" s9 K# X

" f2 X+ v8 h6 @- J
2 a+ z4 D) F7 Z% Z1 J- }, H. L- W, j
baiyongbin2009 回答时间:2015-3-30 11:04:00
18.3 复数乘实数 ComplexMultComplex
0 i& P8 ^- P( B

" H4 t) h5 m9 x0 t; }+ {18.3.1 arm_cmplx_mult_cmplx_f32
公式描述:
    for(n=0; n<numSamples; n++) {        
           pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];        
           pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];        
     }   
函数定义如下:
    void arm_cmplx_mult_real_f32(
        float32_t * pSrcCmplx,
        float32_t * pSrcReal,
        float32_t * pCmplxDst,
        uint32_t numSamples)
参数定义:
     [in]  *pSrcCmplx   points to the complex input vector        
     [in]  *pSrcReal     points to the real input vector        
     [out]  *pCmplxDst  points to the complex output vector        
     [in]  numSamples  number of samples in each vector
注意事项:
    1. 数组pSrcCmplx, pCmplxDst中存储的数据格式是(实部,虚部,实部,虚部……………)

" ~' u+ ?/ B: y+ ~+ r) R$ o18.3.2 arm_ cmplx_mult_cmplx_q31
公式描述:
     for(n=0; n<numSamples; n++) {        
           pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];        
           pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];        
     }  
函数定义如下:
    void arm_cmplx_mult_real_q31(
        q31_t * pSrcCmplx,
        q31_t * pSrcReal,
        q31_t * pCmplxDst,
        uint32_t numSamples)
参数定义:
    [in]  *pSrcCmplx   points to the complex input vector        
    [in]  *pSrcReal     points to the real input vector        
    [out]  *pCmplxDst  points to the complex output vector        
    [in]  numSamples  number of samples in each vector
注意事项:
    1. 数组pSrcCmplx, pCmplxDst中存储的数据格式是(实部,虚部,实部,虚部……………)

- F3 x* {3 ]6 n4 ~- Y2 r
18.3.3 arm_cmplx_mult_cmplx_q15
公式描述:
     for(n=0; n<numSamples; n++) {        
           pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];        
           pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];        
     }
函数定义如下:
    void arm_cmplx_mult_real_q15(
        q15_t * pSrcCmplx,
        q15_t * pSrcReal,
        q15_t * pCmplxDst,
        uint32_t numSamples)
参数定义:
    [in]  *pSrcCmplx   points to the complex input vector        
    [in]  *pSrcReal     points to the real input vector        
    [out]  *pCmplxDst  points to the complex output vector        
    [in]  numSamples  number of samples in each vector
注意事项:
    1. 数组pSrcCmplx, pCmplxDst中存储的数据格式是(实部,虚部,实部,虚部……………)
  a+ I% f5 [9 J; W5 ~8 u- s
18.3.4 实例讲解
实验目的:
    1. 学习ComplexMathFunctions中复数乘法的求解
实验内容:
    1. 按下按键K3, 串口打印函数DSP_CmplxMultReal的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
18.3.jpg
程序设计:
  1. /*& y- G0 K1 ]) v
  2. *********************************************************************************************************
    0 R8 F$ C) \. w" B1 U$ @. k
  3. *        函 数 名: DSP_CmplxMultReal2 Q1 Y1 X, {& {9 U$ N9 n: N
  4. *        功能说明: 复数乘实数
    9 [; ]$ m( w- |' R; k
  5. *        形    参:无7 F+ T: I# B, m, K6 a* x
  6. *        返 回 值: 无7 m2 M3 L- T& D. ]
  7. *********************************************************************************************************( ~& a, o8 ^0 t/ u! r, ^  k- d
  8. */5 ]) H- j, `8 h% I
  9. static void DSP_CmplxMultReal(void)% F+ S( e3 z( f6 L# G+ R; G" A
  10. {6 o  p+ S2 C+ p8 A5 `  {
  11. uint8_t i;2 S3 A) w1 d0 n0 n7 \. {. C
  12. float32_t pSrcCmplx[10] = {1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f};( v" G" i4 F0 k+ |# t: f
  13. float32_t pSrcReal[5] = {1.2f, 1.2f, 2.2f, 2.2f, 3.2f};" j' |2 M/ ~9 @: K  [; x0 F) C
  14. float32_t pCmplxDst[10];
    $ h! h' |2 ^) o' ^' ^) G
  15. q31_t pSrcCmplx1[10] = {1*268435456, 1*268435456, 2*268435456, 2*268435456, 3*268435456, 3*268435456,
    ) s4 T- U5 c1 i( P& j' E  H
  16.                     4*268435456, 4*268435456, 5*268435456, 5*268435456};
    + V2 v5 i* Z5 H3 C& p
  17. q31_t pSrcReal1[10] = {1*268435456, 1*268435456, 2*268435456, 2*268435456, 3*268435456};
    " O6 [3 b  d4 ?$ K0 Y9 i" `* b+ D
  18. q31_t pCmplxDst1[10];7 W* g) h6 {$ q
  19. q15_t pSrcCmplx2[10] = {14000, 16000, 20000, 20000, 30000, 31000, 12000, 13000, 14000, 25000};. C  h$ p8 x6 D: c4 V/ G. {' w
  20. q15_t pSrcReal2[10] =  {15000, 17000, 20000, 20000, 30000};4 _- c* z# N7 @
  21. q15_t pCmplxDst2[10];
      |4 s; ^2 Y/ }( b, d( T
  22. /***浮点数*******************************************************************************/) f7 K- |8 V$ r! U* s
  23. arm_cmplx_mult_cmplx_f32(pSrcCmplx, pSrcReal, pCmplxDst, 5);
    , A, P6 c) w" B' S/ |. t, l7 n
  24. for(i = 0; i < 5; i++)
    7 |( D* @# z& ~; m0 H
  25. {+ M1 ]) s- E2 \  @: h
  26. printf("pCmplxDst[%d] = %f %fj\r\n", i, pCmplxDst[2*i], pCmplxDst[2*i+1]);. n: ?: G, w9 J* L: B
  27. }
    4 M- T7 N* k; y
  28. /***定点数Q31*******************************************************************************/
    2 N. h! \: g2 u0 v  C, a* w
  29. arm_cmplx_mult_cmplx_q31(pSrcCmplx1, pSrcReal1, pCmplxDst1, 5);0 \0 A6 J$ X+ b9 x2 K4 J# j7 c
  30. for(i = 0; i < 5; i++)
    1 M! E8 L- ~6 H6 J! s
  31. {% q2 J5 G2 F8 L! q
  32. printf("pCmplxDst1[%d] = %d %dj\r\n", i, pCmplxDst1[2*i], pCmplxDst1[2*i+1]);2 y$ C& a! L& q: _9 g' g: }$ k3 S
  33. }
    5 [0 D: O1 V) h1 p
  34. /***定点数Q15*******************************************************************************/$ b2 P% f( x. k% K) k  L/ N; t9 G
  35. arm_cmplx_mult_cmplx_q15(pSrcCmplx2, pSrcReal2, pCmplxDst2, 5);  E; E. p& Y$ P% m: h" o" K
  36. for(i = 0; i < 5; i++)# _8 P0 h: R3 d4 i0 }
  37. {% e7 w! J+ D, H, k" I( p  B
  38. printf("pCmplxDst2[%d] = %d %dj\r\n", i, pCmplxDst2[2*i], pCmplxDst2[2*i+1]);) s" H. N/ ^& G" j! C. J
  39. }
    & G7 j7 D' C4 F: D- |
  40. }
复制代码
$ e* \6 l: i* m" q7 \
18.4 总结
    本期教程就跟大家讲这么多,有兴趣的可以深入研究下算法的具体实现。
9 C$ Y. n" [, z. N3 T, q

$ \' ~/ W4 I6 L5 @* r+ h, w
kqh1120 回答时间:2015-3-30 11:13:01
学习了啊 smile.gif
木木鱼 回答时间:2015-3-30 11:26:49
好好的学习下!
sfee2002 回答时间:2015-3-30 12:12:28
正在学习中,顶一下
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版