|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 7 ^' u8 ~. [6 }2 j- N5 ?/ y
! ~( q, [1 `" E* y( r! P各位大神:
' ]! ~5 T) _5 ? 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
5 e/ K# t- H& s/ {# \* u" u 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:% X, S6 O1 U+ k* G, j
; o3 Z7 s6 ]8 ]
, w" R7 Q8 K* ^这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
; w0 z$ ~/ N% @8 O3 I9 J ~
. F1 o. F* c. X, M并没有其他线程7 Y+ \+ t) J( h: e0 S% ~" A
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
# t0 I- T$ D/ |也说不定是和堆栈有关系。。。。。。+ l; W5 ?8 i$ \( s
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....; @; o$ q5 p+ [+ w. ]% ]
0 t0 b1 ]+ B/ M4 j& ?
' T X8 K4 l: p z
9 M' C. v8 W, f5 q
我也很绝望啊,希望大神能帮帮忙,感激不尽,!& f6 u' h- H7 |5 L, t
/ ]1 ^0 W! M6 p7 \3 ^/ k( u6 X4 T; J9 @# b9 A- u
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
9 e4 r4 b: ^6 c& }4 d: k6 Q, { static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。5 z) o2 Z0 ]8 k$ Q! C+ g
" O3 c- y `8 [) Oboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
4 a" [( C& U0 ? const double data1000[1000]) {3 c/ N6 m& Y1 b# ^6 L V
4 U3 `+ T; X9 P) J
int myfuck;/ u, p1 P* k3 A, ]3 b# Q! R
double yiDuanShuJu_mean;
4 r. |9 ~5 p% W double yiDuanShuJu_LowMean[1000];) ~& }( \! I+ O/ _0 H7 Y
int ixstart;
! c/ n4 l) K( H. E double dv0[1000];
0 a* @- e! ?# U, c comm_AGC pAGC;
! N4 q! Y. e* r* D3 } comm_CarrierSynchronizer pFineFreqCompensator;
" p. w: x$ c ^2 | dspcodegen_FIRDecimator pRxFilter; w4 p8 l9 ~! [8 k: ?7 p3 j
comm_SymbolSynchronizer pTimingRec;6 W: _ ^* i( Z2 ]2 P% w i# h
comm_PreambleDetector pPrbDet;6 w% A. J3 l7 x, U. z
FrameSynchronizer pFrameSync;
$ f" n" x9 Z- v2 ?* S QPSKDataDecoder pDataDecod;
4 ~5 G0 }! X' B0 v+ s5 y% R static double usable_left_filtfilt[81000];
! {* k$ q, t0 p& l6 o static double youXiaoShuJu_QuZhiLiu[81000];; Y( p) B3 o+ S$ x
double mtmp;
3 \4 C* O2 S. G h& s: B int ix;
& m" s T; q7 S/ i a boolean_T exitg2;
7 M$ n N2 s; |: m0 B( z boolean_T exitg1;: p* \3 _/ y; ]7 h% L6 o
double YiZhenShuJu[800];- \8 z0 o) {& W* m; m" J
double dv1[800];2 z- k5 V; G# T0 l1 h+ \; t" I
/ `4 r# B3 p- i* N/ O" w/ x6 X5 w- F+ q! G6 J
double b_YiZhenShuJu[800];9 @- v g+ `" s5 k1 E
double I_filtfilt[800];$ O- D3 T7 e, j4 x
double Q_filtfilt[800];0 r; ~4 i# l" P3 I! j) M( |3 c6 R
creal_T b_I_filtfilt[800];
" P9 P" E' C+ ~7 |7 y creal_T b[800];
- C2 n' ?7 C% K' Z- \ creal_T RCRxSignal[50];
3 H2 _/ u9 j7 @$ g. l' S creal_T fineCompSignal[50];% Y& h- f% a' f4 |" T/ T
double phError[50];
3 ]6 U. e/ R/ X, ?5 j* w( [4 W0 ^- H creal_T timingRecSignal_data[28];- o+ u' \" R+ w! a+ G+ z
int timingRecSignal_size[1];' l. M% U, j- G- V. u
double prbIdx_data[28];
& Z& o1 j. `' C$ Y% y( `5 j int prbIdx_size[1];5 {' W; v$ S! k# }. Y
double dtMt_data[28];
% S. v: ~) x. x* F1 j/ ~& w int dtMt_size[1];
9 P b6 z+ A6 b' L creal_T symFrame[25];
* Q8 X; D( r6 H" l: g Y boolean_T isFrameValid;* }/ k4 w- V: P) p) O
double unusedU0[3];. f- ~- `. B, s# ~ x0 D4 j
$ F$ j) H' U8 m, X
//调试过程中的变量
+ Y4 B, a* ^& M! d! S& s' ]6 Z) P+ c0 d int enough_data;
! E% {4 A7 z7 K; A0 \# J- B" i$ ^
0 V4 N# G# S4 _; O+ n5 C4 \ int enoughDataFlag;, Y, {4 F5 s7 W X
int yiDuanShuJu_mean_int;# I$ k+ t' t4 _- Z1 n# i0 w
int int_sum_dv0;; r2 N1 i" W/ S% M9 |
int oo;; j" f+ T( p% \3 @7 A" n
int ii;
, y% h/ Z8 D% I. ] myfuck=10;, A2 X6 I) G7 P: D
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
" G; S8 J( P1 l' G* r% H+ _ /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
- C' u D" R0 r8 G- Q2 y) U2 ]* K# a8 O, y; G' ?
yiDuanShuJu_mean = mean(data1000);6 k: Q9 p; q" K' z6 q
) c7 |! W7 a" d$ ?+ }2 M: F yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
* E% C* }8 q. Y UARTPutc('A');
" S8 ` \" \4 e: b' U UARTPutNum(yiDuanShuJu_mean_int);
8 v0 H) V6 y6 |6 [/ w6 O& l# D# z2 { UARTPutc('\r');
; X, ], ^3 V9 z. J. ~ UARTPutc('\n');
, p2 y2 l: U6 [, F, m& l; q* ]% o! e1 `
for (ixstart = 0; ixstart < 1000; ixstart++) {
. h! l0 ?9 O! J8 m yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
6 }: \5 j* m2 j4 C( L# o; |, P }
* T" d' d0 @' q* c6 B
/ E" L7 R1 u! `) b3 _' H power(yiDuanShuJu_LowMean, dv0);/ b5 E* m2 [1 j- H/ I
- I: c1 k0 q) `$ F p- w* ]1 H3 b int_sum_dv0 = (int) sum(dv0);
1 s/ T) y* d7 C) S1 W1 h
+ R* I3 D( C4 S) ^% G; N% R UARTPutc('B');
+ P3 O- T. v) N, n8 a9 P7 Z/ W UARTPutNum(int_sum_dv0);
" t; u* I3 h7 ^: y- M UARTPutc('\r'); k9 S; U& N i O; o/ c# F$ z
UARTPutc('\n');
3 n R% F& q% J( `. P: d& V5 D5 Q: M: U' C
// int compareFlag = int_sum_dv0 > 1.0E+8;. |. ?) c3 y7 L6 d9 Z, S
5 z2 Y* q& \" p! t( c( Q5 }3 P; P
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?0 t+ Q' e# t7 {5 L% X* f
UARTPutc('C');; F {# i( h' p% c
/* 比较信号能量 */( y. j4 k# k$ P F3 i' a
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */ n, h& w9 W0 c2 j3 r
// yiDuanShuJu_mean = 1000.0 * youxiao_k;! ~2 e) i% z8 F ~$ E4 n
// for (ixstart = 0; ixstart < 1000; ixstart++) {% ~( Z- c9 t! J0 T
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =- N h5 E- T( E+ a; a& D$ g" _
// yiDuanShuJu_LowMean[ixstart];( _5 I- e: g0 ^, t
// }
+ U; Y9 \9 T" P5 G5 ]//
. e( m0 C" ]* Q0 v2 I/ Q// youxiao_k++;4 u% E) k, R: R8 W" d$ n6 p
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
2 U# X2 y9 s' E) s9 \// /* 感觉要取21个数,即0-20, */% K$ S5 W4 I' q- M' o
// enough_data = 10;//有效是10,无效是02 H( E* d; e/ N
// }
# Q9 J* M) z( R9 v }9 A: Z9 P! U o: k2 g
% K9 k* C: m( g0 ?, d7 A: E: J0 O/ S
enoughDataFlag = 100;! R* P A; e3 e- E
enoughDataFlag = 1000;# j" P* h8 t$ y+ A; [+ r
enoughDataFlag = 0x02;
0 |$ _. j: z* y: ^8 B enoughDataFlag = 200;
+ q4 w# [0 S- M( V5 K- Y
& V8 D7 o0 B% d" _; L8 W) j int myfuvk1;+ N) x; }3 ?8 D2 a$ B/ y. R$ k
myfuvk1 =11;
$ Y o) J; x+ K0 a" {# ]' E# h* n( h |' {. u) x! m$ B9 Z
4 r' J& N _* m4 E; I1 R+ d4 V enough_data = 0;
) [2 h; O. R# a8 K/ d" f+ i3 f/ K& z ?" R% y. {2 J0 q
// if(enough_data>50){2 e. m, I$ \" \) `
// enoughDataFlag=0x01;
( y! M* J R' I+ @9 l- F7 c// }else if(enough_data<50){
& M; R( `- r$ h( H. a; z* y// enoughDataFlag=0x00;//0x00还是不行. f/ \$ ~0 d8 P# t
// }5 ]/ z- [" |7 [2 d! ?8 _' q# A
0 q1 ]3 B9 T+ _1 c9 G
y; i' F& {+ [ oo=10;. b3 |& q# q& M2 X5 Q$ [' n" {' Y a
oo = oo < 5;
3 L+ ], D( s# c" a) z5 [ if(oo){ D5 |) Q' F& n, w8 V9 I9 B
ii=0; x* T+ L$ ^6 m0 t: V9 [$ V
}5 Y( o# F: O' _2 t% J# w, S
if(oo < 5){+ s3 C( K' Y% X' e/ X! u; _
ii=0;" x' b$ v8 d* o
}
6 R# w4 O4 j& a7 I" V& y$ U if(oo > 5){8 E2 P' x/ g6 N3 t
ii=0;& W- ]: O" j. p
}
/ h5 k3 [! I; N
- K1 ], u3 \" V3 V- w /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
9 A; J3 K: Q+ B" q6 n2 U /* 如果数据足够才执行主程序 */* y# O! d; Z& i
oo = oo < 5;; i* @' \6 x# o. ^* n
enoughDataFlag = enoughDataFlag < 5;' \+ ?) y6 s7 I* G. x6 o
if (enoughDataFlag < 5) {4 `% r2 h! t B) S P
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
$ Z( d* y9 y) J' r: { d* G. B2 E$ p AGC_AGC(&pAGC);! i% M: r' V; L' H9 d8 N* D7 l9 ]6 S
0 C# }# E& C i' Z7 X c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
& w2 n4 U. x" r. I1 x! M' w FIRDecimator_FIRDecimator(&pRxFilter);
2 k# c2 s( T* s+ }/ t
% T% t) [8 Y7 Z3 V) i$ L: a! N /* Downsampling */
; i: }9 L! A h" s& ?+ R5 P) b; l- o c_SymbolSynchronizer_SymbolSync(&pTimingRec); c+ c0 T& w7 f, H6 Q9 V
; h0 \) \ J0 Z# \1 D( X
c_PreambleDetector_PreambleDete(&pPrbDet);) r q5 U" s5 D" I
9 x. K$ X7 {/ H, o* Q
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
" i: P% W1 M! J; M1 \ /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
8 U# G e6 r# G1 ^# z& N z /* %帧数量=100 */ J7 r: E7 G' l( m$ g* k
pFrameSync.isInitialized = 0;- _. x: D6 w0 p" q/ z: X/ G
: a/ L3 h3 z& `/ n( M9 Z* a8 i
/* [EOF] */ O" E" E- i8 b; b
/* 前导码长度是13 */( u& ^$ i6 f6 L
/* %qpsk */
! n6 m4 D( X* L# }7 [# }/ \ pDataDecod.isInitialized = 0;9 h2 M7 F- g+ T v
+ p& x6 C1 ]" W8 `0 s% e4 _# x8 k /* end */
+ ^$ j* L. z2 r8 b& A5 _ /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
$ S" j! P1 z' j /* Convert 3-dB frequency */
( {' b, l6 w! f* H1 U8 v /* Convert 3-dB frequency */
. r) l% G6 c( a: j( I filtfilt(save_buffer, usable_left_filtfilt);
+ A$ u1 V' l+ B for (ixstart = 0; ixstart < 81000; ixstart++) {
# Y6 R* Y6 J' t/ V# T% O/ M0 j usable_left_filtfilt[ixstart] *= 2.0;- P$ y( U S( E6 C& j! I
}
# C" J% H6 B& f$ R9 P4 e; q+ J1 ^3 _$ q/ R* c: K) P
/* 注意乘2,处理幅度 */
1 }2 k/ X2 I! R, c3 g' a /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
0 p% r6 T5 c1 ~# z3 Z; b; K; } /* %% 行列转换 */. d4 a* e& X1 A4 \5 @5 u
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);+ O6 f+ @0 ^! d5 ?: } `
for (ixstart = 0; ixstart < 81000; ixstart++) {
+ E) {& w- K6 Y* u+ h4 K4 e+ _ youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]9 m5 g# y5 {0 h1 p* B* u1 H- r
- yiDuanShuJu_mean;
l. V. h2 P! _; J- o! x% l( r0 N6 V }
7 v7 r, A; p8 m" t% F5 `8 `
6 t* h, l, C4 \. t# e* { /* %% 应该对数据归一化,但是这一步放在哪比较好 */5 c+ W+ C6 F& `
ixstart = 1;0 W$ s6 j* t. D
mtmp = youXiaoShuJu_QuZhiLiu[0];
c; O1 P& C; B3 I& J" d if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
2 H1 w9 t. R* C: \8 q! {% j ix = 2;
6 d4 y5 @5 @; Y- ~1 O exitg2 = false;
8 v. v; a- M3 o0 R" n7 e. ` while ((!exitg2) && (ix < 81001)) {/ ?4 _% T5 g% b$ K
ixstart = ix;/ U9 D- |& v7 o X( q6 m$ Y, [
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
1 D- G m2 ?1 e2 U) X& M mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
G6 o0 A3 R( a6 j7 k exitg2 = true;" p, x" {# a) M+ v, x' H
} else {
! I1 U6 X% T7 C3 V ix++;+ Z3 V o: v/ t, l$ L% M# H& X
}; }" l5 @( v# c4 O- ?" _
}
' L' o5 I& V+ e0 y* J; h, s }
5 J/ J9 D' j1 q0 d! P( H/ p. c; Z; N" ]' ]
if (ixstart < 81000) {( U0 m2 S, z' _
while (ixstart + 1 < 81001) {9 C3 ~; x8 o0 t, h$ v
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
) ^: }; ]2 y. K4 T4 b2 E mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
( q, O$ T1 b0 n& q2 Q }# P5 C$ Z0 R; J3 o
/ Q8 [. n; J7 |5 N, b ixstart++;5 v2 D- [9 e) b; A0 R
}
& w3 _4 |8 C0 l$ L, ~9 H }7 `$ Y: T9 y9 _4 `: Q) E6 t# ^) p
2 D9 @/ X0 l8 l/ s7 \( S
ixstart = 1;9 H; X) @9 t: V6 _/ n) N
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
) M4 D1 {4 w5 b0 V% \ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {, I8 F# `0 \* O) q3 n
ix = 2;5 |# ~. F& k( ^
exitg1 = false;" w$ c w }. R. f
while ((!exitg1) && (ix < 81001)) {. }, o! N$ [/ U! _; N4 M
ixstart = ix;
+ w; b+ K* i. O0 L if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 g& p. Y( H0 x' L4 y* u/ b yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
4 P7 ]( T' X1 @) ^9 j8 C exitg1 = true;
# D3 U2 P) _* }& E. d; ^! r } else {
4 I% M: R k( M) T6 B ix++;2 @9 C! u$ c. n0 m& ~
}8 n; C* b; B" Y e. z8 E( R
}
' u8 }: R3 E% R, g9 [0 C }
9 T1 o t$ s. p& H5 {" S8 y# X1 v' _" K/ R
if (ixstart < 81000) {
# p: q4 M) r7 D2 V; b while (ixstart + 1 < 81001) {; x, R4 s/ F/ A: g5 u2 B! C, p# G
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
0 I. d9 t! f0 c! C yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];# Z) T6 E6 X3 Y, `- a. o a0 _: G3 L& ^
}
1 Q6 n% N/ q2 X. d- \1 m# |; Y+ ~. L. K R" C
ixstart++;% ]& A! N# W! _5 P; V! c
}. Y) K) A1 O4 P. c6 e1 E/ N
}* _- x+ h! Q( i: D
6 f/ b/ R7 M9 A, h8 i4 l, [- H yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);# T' Y! U! y; @& H9 G% n
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
3 D8 f; k& \# }7 O- C yiDuanShuJu_mean = mtmp;
$ K7 k4 f$ b) Z% t }) a8 K" X3 {9 H3 F' w
9 y6 A/ `6 ~6 {. U
/* 找出极值 */ c6 F. O& E* L7 U1 f
for (ixstart = 0; ixstart < 81000; ixstart++) {( ]5 g$ K1 r7 g, H
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
, u: S$ @3 C8 Z& v l+ s }2 I" E9 T7 E! ~& k" p( j
9 w4 u/ r3 z& m c8 \
--------------帖子字数限制------------------3 {2 `% ?( N* X3 ^7 ` X
}
* l$ o; Y* Y4 u* Y3 O6 Y
# F/ F# {$ x# `& o) K. G$ W2 d% B3 W* h1 \+ E
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|