|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 . b8 D7 r) ?* S- S& w0 s
. H5 I6 N {, W+ \8 Z6 B
各位大神:9 ~2 l/ s) s( g4 w
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
& y0 F. U' K( N# i! e 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
# b: ` @$ X& J+ Q6 d' m( }+ ?( h! n' Z
' G7 O; t5 n ^0 s8 R Q8 e这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
4 P8 [' C. e3 G6 H
+ s# @) I) W: A$ T% P8 t并没有其他线程" j; ?, m( t( m8 Z0 @9 a' A. T
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。2 N8 Y" L# g" n4 S
也说不定是和堆栈有关系。。。。。。# q5 d0 x& L) k; l& N+ S
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
: r- x# T! V2 b6 P7 v7 q/ w2 ?& q7 O( c
6 K( H) `6 N& C3 P5 D/ ?6 J9 w
+ P+ g( s7 Q/ \3 Y% q% ~8 r5 s我也很绝望啊,希望大神能帮帮忙,感激不尽,!
# S# i% J( A9 f# ^8 x3 ~6 F; S7 Y' S) p+ O6 t, p
5 ^5 h# e% `/ `9 Y9 w2 `附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
- l3 J: g1 @5 |# ^ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。4 V+ h) H5 T6 k
' L' f, @9 S/ Qboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(1 _ E. g- R0 P6 K. C/ u: D
const double data1000[1000]) {$ U. g# Y0 _- l
% J& @9 S7 u. o/ E. N! v1 O( {+ \
int myfuck;
4 \" v3 o* ^ S$ r5 B% C double yiDuanShuJu_mean;9 f. \! D1 l5 D/ s2 O P
double yiDuanShuJu_LowMean[1000];
( u3 \8 w% E; {% P int ixstart;
& p) l1 t& {; u$ p; q! ]. w double dv0[1000];
2 ?5 R" Y7 s8 T# ]7 c; c% v/ ?; T comm_AGC pAGC;
5 l; k7 f& A$ S* g* \/ a comm_CarrierSynchronizer pFineFreqCompensator;
$ T: E& \: {# V: R2 o; `+ P dspcodegen_FIRDecimator pRxFilter;" [* v0 W( D* q. z7 w K- W
comm_SymbolSynchronizer pTimingRec;/ i0 ]+ u" D# p5 Z* [3 W# y1 Q
comm_PreambleDetector pPrbDet;
3 z7 ^% U8 {! W+ H; a0 m2 l FrameSynchronizer pFrameSync;
1 t7 w8 X h2 i5 r QPSKDataDecoder pDataDecod;
0 @6 M/ } A' ] A1 U1 T5 ? static double usable_left_filtfilt[81000];
) t1 g" x+ E% m/ V static double youXiaoShuJu_QuZhiLiu[81000];
4 V- v7 @4 t% T' t double mtmp;
, v2 K3 J ?% B" X0 e5 w5 o int ix;: K; j0 J% |' U- x7 [, C7 z2 t" A
boolean_T exitg2;
/ S+ a: o2 ~1 t. {( e( F" } boolean_T exitg1;( n& P1 y3 N9 |3 V5 i( P
double YiZhenShuJu[800];( p2 d# T, g( Z6 |
double dv1[800];& K& h. u0 C% ^
2 h! d/ Y$ }' g7 o1 r* ^9 [- G2 }; |
+ N) Q, q$ v5 e
double b_YiZhenShuJu[800];' U3 B9 g/ B: X- w5 I j& I
double I_filtfilt[800];
8 i8 h9 K/ [* X }" Y2 G2 A double Q_filtfilt[800];" B8 l0 W5 D: d: h3 n7 x) f( z
creal_T b_I_filtfilt[800];/ z+ {1 d% z: i4 |, K/ Q" S1 y$ B' w
creal_T b[800];
# V6 R; x% R: ~5 J" r; c+ R creal_T RCRxSignal[50];
6 k1 B7 o* T) X8 z8 D creal_T fineCompSignal[50];, ]9 J3 k7 Q# y, q l' Y( y3 r9 o7 d V
double phError[50];9 K V% I5 p1 z/ A& T3 ?) w$ s
creal_T timingRecSignal_data[28];& @5 i8 \& E, B4 C
int timingRecSignal_size[1];
) V9 N5 P) d5 B double prbIdx_data[28];
% n+ k/ @! }2 b$ Z1 @/ s4 p% ] int prbIdx_size[1];
1 ^ k' a. P( Q( [" U; y: X+ J+ V+ G double dtMt_data[28];
; z; M. I- N7 i2 O int dtMt_size[1];
% l( O3 @/ d4 w' T1 q& e creal_T symFrame[25];; \- s* o' e" O6 s! Z
boolean_T isFrameValid;! D& V4 s" S5 N# H* Q
double unusedU0[3];
. t3 f1 J3 X. P; C: C: ^
2 x2 Z: N! C; U7 n4 O //调试过程中的变量
) o* q1 O% I& r- K' g! a int enough_data;
/ a, a- o8 k# r! I1 l! @
( l' M z- X% C9 o/ u int enoughDataFlag;1 k: t% z/ w, `1 K( U! C
int yiDuanShuJu_mean_int;
# j. L Q8 z, V" r9 u int int_sum_dv0;
" z7 N& d/ y1 }; @ j2 a- _: A int oo;
7 W( ~9 h) T t' M0 U int ii;6 |) r/ W7 a2 j* }8 v' l8 d
myfuck=10;
8 b4 K7 B, v; ^" \. Q /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */) w# Q" a: O' i2 @6 Z3 }1 Q: O
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */2 A o5 e6 E8 [' k" C/ I4 Y
! _3 K6 f6 t& Q3 m' x( `" z1 }
yiDuanShuJu_mean = mean(data1000);
+ g! v7 v. E$ [( z; K4 s. W; Q
7 L' I; P3 z1 q5 d yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;2 _/ W& m: U% d& N# I7 l
UARTPutc('A');
1 Y' X- X: C; x( A0 C UARTPutNum(yiDuanShuJu_mean_int);( X% E! Z4 c; _+ ?
UARTPutc('\r');
% B8 B* F/ i5 n" S; D* n5 x1 g UARTPutc('\n');
- @2 ]+ W. a+ i4 a, N* ]/ j, V2 r0 [. Y
for (ixstart = 0; ixstart < 1000; ixstart++) {( t& ~8 A% {& c7 I4 u7 V
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
: C8 X/ N j k& e }' Y* @! c# X: P' c, F; V! N; p
3 V# o) J w( G
power(yiDuanShuJu_LowMean, dv0);
5 s$ Y2 ^ o+ ]% w$ D/ U% \: V. n) A7 C9 t) J+ j) Y; Q
int_sum_dv0 = (int) sum(dv0);' X* i# m9 ^. D/ ?) i% w5 D
( B# R8 l% n) e2 J
UARTPutc('B');
% k& ~$ [, b) ^' f) r UARTPutNum(int_sum_dv0);# c" F; v1 Q& u9 N* e- s
UARTPutc('\r');
# H2 v5 ?( H1 a% }6 J n) f UARTPutc('\n');6 R9 T( {/ c6 G
9 ~7 v4 v2 X& ]& f* j' ], R
// int compareFlag = int_sum_dv0 > 1.0E+8;
]) C3 H8 ^& m; l; A+ x
+ Q, d3 H3 _4 [6 [0 `9 ? if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
^) u; p& T" V6 V+ W: }. X ? UARTPutc('C');( r) n! b r5 h
/* 比较信号能量 */
' t4 s! ~- _, h/ _1 y /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */ f. S0 b. C2 @) ]. N
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
) ]8 c3 s( D9 k/ o9 d2 }6 y// for (ixstart = 0; ixstart < 1000; ixstart++) {
9 }# @$ T& L3 K' b$ A( k// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
" Z# @* t; \5 N1 K// yiDuanShuJu_LowMean[ixstart];
7 v& q+ T1 l8 ~/ e: e1 z5 k- \# u9 [" @// }
) c/ M. |- K& \, @- w% D* c//& u5 R0 S; X' G9 P/ w
// youxiao_k++;9 j& I( @+ i. t- T) G. \, g
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==1 G* B' D% Y0 G' }+ Y! |
// /* 感觉要取21个数,即0-20, */
5 }6 @! g2 n m3 ?9 d8 M// enough_data = 10;//有效是10,无效是0
* w* p: ]9 {9 [% R! N" x// } M9 L+ ~9 K" x6 m1 f7 F7 } I
}
. V# F$ r0 w/ P/ Z, M- i# ]& z) ?7 W& V0 Z' E% W5 j4 ^+ v, P3 o2 o
) F# [5 `: W& ?1 ^ E enoughDataFlag = 100;
- c. G( u) x/ E: \" |" w5 R7 T G enoughDataFlag = 1000; M. `: t, {$ Z1 h( K+ V# l
enoughDataFlag = 0x02; D6 }' r. X D. p* U0 ~$ f! P) d
enoughDataFlag = 200;3 r+ x9 @ {1 G8 @
3 \1 o( G; z1 j7 g1 Z4 D. ?2 }
int myfuvk1;* ^; S H! M$ E' b* u
myfuvk1 =11;; C) \; y, l2 L! ^- ?3 i
* F J7 ]1 d$ Y# ?# q M! D" m: m: w" l% n
enough_data = 0;
; E' c# a" e, J8 p U$ U9 t7 a' O4 ~
// if(enough_data>50){: ]8 ]0 w( ?0 f$ B
// enoughDataFlag=0x01;
+ ^4 T$ ^& ]. w* g// }else if(enough_data<50){. m" A8 U C: y' \
// enoughDataFlag=0x00;//0x00还是不行: m1 L9 Y+ g% K+ b/ O
// }
' G/ ]. R, ^5 p& j: y% b& e# m2 r# R6 E3 Y+ N- j7 J
4 b: y, C! \' b9 I2 O J oo=10;
. `3 P; l7 D2 n o4 {4 ]+ ?3 U" a2 F oo = oo < 5;* h) G! w+ W S# C( Q$ B
if(oo){1 J! r7 Q$ i5 i) h
ii=0;
; `) m% l, ~$ Q7 _$ W% O }- W; H5 W. v0 t( `: q
if(oo < 5){: W4 @- q. I# A
ii=0;/ l7 k- \+ r9 c6 v0 }+ r
}
b4 L4 Q6 S: j& \8 A: |1 Z; z3 D if(oo > 5){4 V+ q" l/ d5 @8 a
ii=0;
& Y9 v1 U3 W8 m0 }, j( Z/ ^ }, W$ ~+ @9 a# s) b0 O9 @# b
1 Z( @! P3 U4 k9 ~) U /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
8 e0 C" F, |7 e( k: A4 m ? /* 如果数据足够才执行主程序 */
1 _/ ^8 s6 I* Q: ^& I oo = oo < 5;7 ^8 c. L [9 o& D2 S& G% R
enoughDataFlag = enoughDataFlag < 5;% Z+ i" _3 B; U2 }6 X$ D) @1 E
if (enoughDataFlag < 5) {
. L# B% H8 K; [// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
& Z( x: K$ J; o9 R AGC_AGC(&pAGC);" d( u8 c n# r" n, |
. n0 o1 L# @( q c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);: e1 |/ P2 ~* [) W8 G$ o7 w9 H6 L- A
FIRDecimator_FIRDecimator(&pRxFilter);8 H9 D7 U( k9 H' K1 C/ `
3 T9 C/ ?! }! P8 D2 u' ? x- f8 V /* Downsampling */
% l0 E: j* y; ~1 b c_SymbolSynchronizer_SymbolSync(&pTimingRec);0 ~5 _0 n' l1 h% y. v2 O5 _
) m; B4 L9 I T: O% L* H$ T& B: n c_PreambleDetector_PreambleDete(&pPrbDet);
) H& t% x4 Y8 Z7 v( d
/ |1 b0 W3 z3 ^7 Q* s4 U) H /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
" c$ S! |/ Q. M% O! ^2 X( x2 i, H /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */+ _- Z, b$ ^% L% M# X
/* %帧数量=100 */
4 g% z8 F- U1 e2 y9 z+ I pFrameSync.isInitialized = 0;+ \9 ?, F* S ]8 E1 [ @2 t
2 v+ e5 l5 n6 B% m" c6 W /* [EOF] */. s: \( Y0 O) ^+ r& |$ |
/* 前导码长度是13 */
( t! P2 V5 s1 p+ Y% n* \ /* %qpsk */8 E! c* b. Z ?
pDataDecod.isInitialized = 0;1 X* m( Q) U% p" h' T, Y" _
3 e6 E5 h7 D) G$ I
/* end */" p" g& X/ V1 B- w; `* }4 b& o
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
' [$ p" a* X6 \, h; E$ J /* Convert 3-dB frequency */: I$ }. W6 D+ H; {) v8 s- M
/* Convert 3-dB frequency */
/ Z) J8 V+ I/ Q- `6 O7 o" {& J/ Z filtfilt(save_buffer, usable_left_filtfilt);
$ `# {" {% D$ g/ i: ^ for (ixstart = 0; ixstart < 81000; ixstart++) {& A" q7 h/ ~; \# a
usable_left_filtfilt[ixstart] *= 2.0;
# l( t5 W; t% b6 p+ }9 B }
/ X4 n, W8 \" M7 `! x+ E T% j/ b/ h a3 x/ M8 [
/* 注意乘2,处理幅度 */4 X! o5 p/ w& ]7 g; j
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */. G7 W0 i. _2 ~
/* %% 行列转换 */
6 v K8 V. N4 U# X6 B yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
/ W3 X# c) K s. `! q9 X/ ]0 \ for (ixstart = 0; ixstart < 81000; ixstart++) {& Y& Y5 e2 m: Q6 D
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]: K; l7 N2 b: {9 o9 X
- yiDuanShuJu_mean;, D2 U( \% G! {. ^- k8 _
}
( P. c2 c2 m6 Q$ x$ W9 t6 p
X3 e$ Q5 |# u9 ^( r- F$ e /* %% 应该对数据归一化,但是这一步放在哪比较好 */
8 w" o6 S6 B* N7 X. l1 ?( O3 S ixstart = 1;0 y; Z" R6 y ?! a( m8 S
mtmp = youXiaoShuJu_QuZhiLiu[0];
5 @: ?% j. x& h! O- J+ F! \1 E if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
6 y. s3 n$ l3 r' D/ p ix = 2;
( `1 o( n( [ P0 F* ~, V exitg2 = false;# H% P/ _9 @5 V
while ((!exitg2) && (ix < 81001)) {9 y7 J/ [' o2 G" e8 s3 N
ixstart = ix;
6 e: B/ h: F2 R% m m' ^ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
) t: V: P2 L( A mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];1 s% z: R3 {$ M& r/ {- l
exitg2 = true;
1 M. ?8 D9 ^" g: D } else {* H: F8 b* ~$ E, [
ix++;
: z5 d4 o6 W* c$ w- ~ }
/ r! G5 q/ Q+ ]' Q }1 k& x% I% g& I: }! _8 H0 G% C
}
+ r2 R4 T8 d4 v' P
6 F. |+ C# \$ ~2 R2 Z1 f `' E# { if (ixstart < 81000) {
, c' T6 t, ]. M5 [3 J while (ixstart + 1 < 81001) {* @% P& L7 t. m6 k% Z, J
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
" P! ]4 J" J8 Q8 k; X4 ` F mtmp = youXiaoShuJu_QuZhiLiu[ixstart];+ [& X3 P: y, k6 M3 e& A
}
- k% _3 V' n# |% U. [
1 o. W5 _$ ~/ u% d ixstart++;- Z1 x1 C: k5 V
}
+ C- F) t. F! z7 R! | } G5 c: O5 H9 H1 H
7 B8 e! l$ l$ R" E2 \' a4 | ixstart = 1;4 K2 |1 p0 Q9 W1 I/ r6 x: D
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
9 ^+ n) p1 p: V) x if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {& m5 p8 T! x5 f$ Q1 E
ix = 2;" E1 L' @5 H C6 {, k. d1 _
exitg1 = false;
1 b; v- `: z6 b: O7 b while ((!exitg1) && (ix < 81001)) {
& A6 f E! D$ K3 l V3 d ixstart = ix;7 u* H' @2 X/ D& ^# O$ e
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 B7 e: b2 X8 }. X* l yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];7 N3 ~7 J. h- t: ?5 C
exitg1 = true;
( B* `5 t- i8 R4 r3 u0 `, |4 o8 Z8 E } else {" C0 x9 N2 Z8 ^9 m
ix++;
7 k8 ]* }0 { t! E5 B2 t+ T: w }
$ i* I& W5 e3 @4 G( S$ i, F1 r }
0 a% \5 D( ?' a9 \/ y }/ Y' \3 O) O7 S
. k. R# n2 V3 r+ J
if (ixstart < 81000) {
/ W" w/ J# B ~3 ^! Y while (ixstart + 1 < 81001) {
1 J- y- P6 X( k% [; N: x6 [% Y5 A if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
! J; Z; Y; y- e( i9 z; X% Y# `/ U yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
" L, i- C. N; j9 ?. T4 ? }( V/ j1 p% _3 q. K
# _' R8 n( G* E f* w# [- [: B ixstart++;
, a0 w9 C' E' Q" h; D }
; ~8 D g9 e: D }
+ Y5 G/ r; m$ T; I, P+ f, {) w6 _& K u1 }
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);2 L2 K" |( ~( y) z% R/ m
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {5 r D( A* g% z$ r) r$ O7 Z
yiDuanShuJu_mean = mtmp;0 J+ m3 g+ [+ H' o) U9 }& I
}
3 [1 v3 _( o/ ], q
- P* c# S' v2 r0 f /* 找出极值 */3 C) F6 ~/ l, w' X' u
for (ixstart = 0; ixstart < 81000; ixstart++) {
7 _; Y7 G) T! O4 ?% q, { youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
2 \) C* z% K6 O: c9 L' G6 U/ @ }
. _0 U, n! }0 P% }: n l8 I: I) n4 e2 m; K
--------------帖子字数限制------------------( }2 L6 w+ |2 H3 ` `2 `
}8 G, L( J) R) D1 n
: u0 R4 | r/ m. H' c5 E
( ?" t* C o' |) ^) @ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|