|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 , W( d3 ]$ b9 L1 G6 z
( ~+ [" L a9 j) Z/ n- g h2 P
各位大神:* k- g2 c( `2 J
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
% V g3 j& G' k: r 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
1 z% s/ K9 p r2 N1 g& s8 \3 @% @$ ]: |
/ x9 D4 R( v B( r9 Y1 C + j X5 ~0 a% ]/ @8 \: U
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
% C' e% I0 b# X. K: r' ?/ D% q9 D1 q& F' I: w) V' K. Q) q
并没有其他线程+ E- a0 E- N# ~# Q
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
+ d0 J4 `% B, V也说不定是和堆栈有关系。。。。。。
( v/ b+ ?9 Y9 |1 Z0 V请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....5 P3 N/ ?' Z( L5 l) Z7 @9 [
1 l+ C$ c# K. O* o V
. D* h9 {3 s+ U0 B# K% p9 ^3 P9 ]& j) |' ~8 T6 g
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
j4 r9 n. r8 |, L( i8 ~
7 a! G( v& s" z( _5 I
) U3 K! D/ z3 |1 B; _附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
; A0 B2 d, G+ k" u static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
9 x( d$ E( ?' W
; }0 v1 E& z) \" cboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(3 l/ ^0 f: X( k j* J) W2 e
const double data1000[1000]) {
0 g) |& j+ o7 z$ }/ U6 K# ?
. Z6 `& {6 O/ |4 x int myfuck;! {1 R, q. }0 l b+ B$ K* Q
double yiDuanShuJu_mean;- q7 L" \0 @6 K
double yiDuanShuJu_LowMean[1000];2 J: U+ q Z% ^" Y$ W
int ixstart;
# Q' K; M5 ~5 n* C double dv0[1000];
0 g7 y$ C, N8 G6 I' Q comm_AGC pAGC;5 L; A8 }7 E( w
comm_CarrierSynchronizer pFineFreqCompensator;
! I7 i4 y9 [7 R5 j; v; n dspcodegen_FIRDecimator pRxFilter;
" I8 Z; ^+ ?1 J1 t- X% c0 a comm_SymbolSynchronizer pTimingRec;
6 @/ n1 P7 F0 | comm_PreambleDetector pPrbDet;
+ D0 o8 ~4 e5 I3 w FrameSynchronizer pFrameSync;! {1 Y% M) e: v+ O3 V3 E7 `8 Q
QPSKDataDecoder pDataDecod;
' v, {4 f# s5 ? static double usable_left_filtfilt[81000];& B+ D- G" d# v% E$ `8 I. G
static double youXiaoShuJu_QuZhiLiu[81000];
% R8 ~2 I8 P n) b) Y double mtmp;
0 E+ Q7 g) ?8 }1 B& H2 N" K* V1 S int ix;
7 | M$ u2 q4 [. \& a7 t; B @ boolean_T exitg2;$ G" g. J: ]# G0 V! I q
boolean_T exitg1;
5 ]% x. K; j: J3 t) d2 J- i double YiZhenShuJu[800];
2 X: H( e4 g. a/ W* ~) H; G- R double dv1[800];+ g# S9 P2 x) A) k4 B( `
# { s. f7 t* J8 w, I
1 x' F0 C I2 b1 J# O3 }4 E$ ]$ k double b_YiZhenShuJu[800];
' L7 u; N3 e- ~# Z double I_filtfilt[800];
8 p/ F& ?8 r5 d2 b* l double Q_filtfilt[800];/ U* n0 o/ K. f' Y# D5 J8 Y
creal_T b_I_filtfilt[800];
: @1 u2 _; T3 D% H' K8 q creal_T b[800];# b% x. `' d7 b
creal_T RCRxSignal[50];
. k; |* ?5 z; m$ d; k: s0 R creal_T fineCompSignal[50];# j f( F8 j$ S4 T$ u
double phError[50];' K1 V, s0 E( k, P3 h$ n
creal_T timingRecSignal_data[28];5 S, h. \( t' l2 N5 \
int timingRecSignal_size[1];
. ~* L4 ^6 M# z1 r5 A" d double prbIdx_data[28];
9 |& s" A w& ~! D1 @# x int prbIdx_size[1];+ I2 @" r6 V' G
double dtMt_data[28];
& C; p" M( C+ A8 B int dtMt_size[1];$ U, U" h6 P1 |$ n- a7 `+ R$ x
creal_T symFrame[25];6 H# d8 Z# ]2 C) P# |( y3 M
boolean_T isFrameValid;
* Z, L2 W; w" C& s" P double unusedU0[3];& x. Q+ K( P; e& @% y7 `
) R+ b8 c7 l% _
//调试过程中的变量" x' z" _. r2 C0 D# U% k1 {5 `& w
int enough_data; A$ {4 ?) g( F! @6 F9 ~5 ]
E" |$ t; ^( a) T6 R$ T
int enoughDataFlag;
. H7 s- ?- y* J2 y0 ~9 S int yiDuanShuJu_mean_int;
5 W5 m+ P: X8 p6 m F int int_sum_dv0;
; e% h7 v. f) L5 d0 E int oo;8 M2 }+ _1 L; n$ ~# ]1 E x& C4 W
int ii;" |; o8 g" m1 o# a/ n+ I
myfuck=10;
9 ~3 I' b0 |% x) B /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
- n( Z1 D7 L; q/ G /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
1 c3 S; [, f; D: S
+ M& P7 S; t4 `+ a7 n# |' A5 M yiDuanShuJu_mean = mean(data1000); w; i! ^) y; f$ H
( v' F: u% c8 [% `$ t9 `! W yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;* I. b& v* Q1 y4 V/ q# R4 E
UARTPutc('A');
4 v6 v+ A) a# i$ G' _! a# p UARTPutNum(yiDuanShuJu_mean_int);
. d9 F' b1 m: H2 j c UARTPutc('\r');
9 h$ \1 d$ i1 H8 U- A# ~' x6 A4 T7 y/ V UARTPutc('\n');
& ^) x( q7 ^' @" K D) T
8 A6 e* t8 T0 x( c: Z% S# G% l for (ixstart = 0; ixstart < 1000; ixstart++) {
0 S( J0 u. u% a" W9 a% [ yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
% M6 e: V: I1 B) i8 o2 L" W }
0 {3 h9 ~7 F8 T1 Z2 x1 S" X
+ Z% D* g+ m* X6 ~/ O, J: r2 L* o2 d' J power(yiDuanShuJu_LowMean, dv0);9 j4 n. X- S% s1 e
4 r. E7 z. I* j( e int_sum_dv0 = (int) sum(dv0);
$ c$ \" n/ ?) D {* y
( v9 j2 m) P0 D0 c9 n: B8 D3 u+ ]& a UARTPutc('B');
9 \; }6 A& `% [' h UARTPutNum(int_sum_dv0);
4 I K& |1 x: B# B+ m$ { UARTPutc('\r');) Q& E" N% j5 j
UARTPutc('\n');
! |. t7 `! j* x, Z. C$ O9 X# f9 K
* r& Q1 T9 H& }1 z// int compareFlag = int_sum_dv0 > 1.0E+8;
% v/ h+ I! s. E: t9 V# ?8 m& G( x' y& Q
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?# {8 Q8 N8 Q& |' l) B/ n
UARTPutc('C');; D: t" H, q2 [5 x! t% l
/* 比较信号能量 */6 b) m5 b# x6 o
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
' o& ]& X( l2 O// yiDuanShuJu_mean = 1000.0 * youxiao_k;
, L5 ~2 F; }( @& M3 C* a// for (ixstart = 0; ixstart < 1000; ixstart++) {
% o) `& v z1 x// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =' o5 [) V' h* Z
// yiDuanShuJu_LowMean[ixstart];1 X/ R( A; f- { a1 [; \
// }
9 j3 R& ~ _" }( u( G//
( h; ?/ z8 _( J2 _7 c// youxiao_k++;& I+ y* m0 O3 c
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==; h8 N( E: C+ J& P" c5 I* U
// /* 感觉要取21个数,即0-20, */
/ r/ _( T4 x! i6 R, x5 G3 Y// enough_data = 10;//有效是10,无效是0
( _3 T1 ?" O8 o, O. D' [3 G" J// }
( ]! @: y' ]. r6 W( f8 H+ d% V* l }
7 r4 u* l, U" T/ Z$ f) B& C; K# D7 L
9 t, l# Y2 B; v3 G9 v' \# a4 I- W# p1 T enoughDataFlag = 100; Y6 r% K$ K: U' k9 t" \
enoughDataFlag = 1000;! T& c) X' G) ?+ d
enoughDataFlag = 0x02;4 ~( H8 t3 l1 B; m1 D( a
enoughDataFlag = 200;. k/ @: t$ c S0 r7 A$ a( k6 Y
# X1 d& a. c7 d9 F int myfuvk1;. V F1 T1 c. w3 p2 `& y R9 m. F, G
myfuvk1 =11;
8 ]$ j9 h* q( F: c7 j, U) H
: K I& B7 [! |' N7 C8 a1 p0 z9 y+ U& X' `, @4 O6 {# ~
enough_data = 0;! o! ?! F! |+ g4 |% j; s% `; W
, w9 y. Y6 L4 D \/ F! c// if(enough_data>50){
3 V2 G( i, h, j/ G! \// enoughDataFlag=0x01;
5 m2 X0 X2 h. K" f" { y// }else if(enough_data<50){
. \ @& N8 ~* L// enoughDataFlag=0x00;//0x00还是不行
. ]3 v" C# U2 Y% X3 k" `- b8 q2 `$ ^; B// }4 W* B2 N8 r/ B5 y
' c/ {2 e7 _& I% Q8 j+ H
1 H8 b! e% r u& K& B4 N4 L, h2 p- S
oo=10;$ K- L3 v, V3 Q' x2 a2 @
oo = oo < 5;
! E% m+ d: B8 y& V" I if(oo){
/ l' C8 P9 G2 M$ f6 l4 @0 b ii=0;
4 \3 p& Q: Z# D% z. l }% k/ c/ t* W4 @% y/ ]
if(oo < 5){
@+ |( G8 _ V# G) B3 c ii=0;0 b( W& Z. I* S) W9 z8 d x' |
}$ H2 y# R( F7 B1 \* |
if(oo > 5){5 y) R# p1 g+ U
ii=0;" F N5 q% |2 k6 v
}
& b/ @! X9 K+ \7 {& |4 u
- U' k/ c9 j: \0 H) A* {/ g /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */2 F4 z Y" u# {: Z6 W; z/ m1 R
/* 如果数据足够才执行主程序 */- c; s! s0 j4 Q) v) L" ?7 Y
oo = oo < 5;* j5 H" `, Y& _( J0 f
enoughDataFlag = enoughDataFlag < 5;
6 ]' Y5 F" u' d+ ?, d8 } if (enoughDataFlag < 5) {# j8 H% W2 M$ H. A
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
! u/ E5 A4 ^! o. Z; ]: c AGC_AGC(&pAGC);
& N3 k: Q% O5 I
. }) N j) Q& u. U5 l7 }4 p c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
$ w/ O9 I$ i% Q5 M9 p$ e FIRDecimator_FIRDecimator(&pRxFilter);/ o7 D7 u/ \# @1 q! y- D
. @- ^+ O7 b" d! Q( n3 \
/* Downsampling */& X& T6 ^& |' W/ B3 m1 K
c_SymbolSynchronizer_SymbolSync(&pTimingRec);0 l0 S' p& T. u: W$ O
9 I3 S( Q- k% ?( k c_PreambleDetector_PreambleDete(&pPrbDet);& V$ _& [ P9 W9 M
& h- e4 \) y' I; u% {$ F8 b1 J
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */1 ?$ S% [7 z# t- ^" I+ L! G
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
7 l( a; _& M3 i- [9 S+ K4 } /* %帧数量=100 */! Q, U* U( `4 {% M1 C
pFrameSync.isInitialized = 0;7 ]4 ^* _& [9 T- ^1 m8 {% P
) M7 c, b/ N* ?5 C% B
/* [EOF] */
) `) L9 x% R% u$ T/ o$ ^' ?: a /* 前导码长度是13 */' L) s) c( X7 v5 w2 r. F
/* %qpsk */# f: m! x. n- U
pDataDecod.isInitialized = 0;
z5 T6 ?( m& x* K+ _
1 q, i$ }9 j m* A& ^) r /* end */) B, {& ?% C& {" T
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */* u. E) `, ?/ m/ z7 e2 `& a
/* Convert 3-dB frequency */
( d7 s+ H4 l4 G& U8 i /* Convert 3-dB frequency */
8 n: O& V* x+ N/ V( o: c) c filtfilt(save_buffer, usable_left_filtfilt);( C# R# m, n. l) X6 [6 R k$ e
for (ixstart = 0; ixstart < 81000; ixstart++) {9 o6 D: l6 ?1 r
usable_left_filtfilt[ixstart] *= 2.0;
; @+ }6 _; t0 C5 a }! e. i% z/ g- n( X4 i" j# C
9 b M' }2 B* E- M; w
/* 注意乘2,处理幅度 */
% a8 q$ D. M" E /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
0 W' |$ l6 [) u, n /* %% 行列转换 */
5 ?- c+ g3 [# x( |8 ` yiDuanShuJu_mean = b_mean(usable_left_filtfilt);9 P) Z2 b- }/ y0 `2 c' d
for (ixstart = 0; ixstart < 81000; ixstart++) {
# V( p1 a6 i; N youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]$ `1 S5 T/ A( \7 H8 z3 `. G
- yiDuanShuJu_mean;
4 ]* J* B# Y+ X) I9 `6 j4 f }6 N2 R7 {( R) h) x- U$ E
0 f9 b h, p5 S: i8 W
/* %% 应该对数据归一化,但是这一步放在哪比较好 */$ {* M8 I8 Y5 B! V8 i
ixstart = 1;
: [' H4 |! w) Y' V5 r. x' x mtmp = youXiaoShuJu_QuZhiLiu[0];
' r6 E4 L9 g, |9 _- s3 A5 |) T if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
0 @3 \$ I# x9 \! }& j ix = 2;. M G4 l+ b4 ]% x$ ~9 Y4 O
exitg2 = false;
' l( N# a. B4 F while ((!exitg2) && (ix < 81001)) {. `5 G4 C$ A ^) ^
ixstart = ix;
9 ^8 R* {0 N; K9 X2 c" F3 Z4 t" h1 M% \ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
4 Q: r1 O @% G; P; C3 h mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];, U8 C; i$ V* I1 X
exitg2 = true;
4 h7 p; s2 c) g! s F" @2 j( u6 u2 o% q } else {+ I- L8 S0 e; I7 g: C
ix++;
! [, t' ~% T* ]3 r) d- U# q8 P }
, A+ `; J7 u! R* ~$ o' O+ N }4 l( ^7 j* d3 L E7 |1 U) w; W
} L: T4 ]: O: W# U# P6 G
- J; y7 c* X# C8 E( B! |; |3 { if (ixstart < 81000) {
* r: N J/ y$ r ?( z3 i while (ixstart + 1 < 81001) {: I/ p" E$ k4 l- G' M2 V3 Q7 R a
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {0 L, U% k2 C! O: D! A0 _" G" R% m
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];& r6 N) c/ v% e3 b; s# }
}0 G: i" k1 l" n- f8 |6 j( v
8 u0 {. P/ x/ y7 z
ixstart++;
+ F8 [6 j* I( t8 @ }& n5 v( W4 S+ w( d* q" p
}' ^( a) |# ^: k* n( o3 h$ p" S1 o
% P, w- K$ W6 m% E1 E& V. M
ixstart = 1;1 e5 P* z/ Q6 R- C& K% L8 u: G
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];! v. s9 M) T8 c9 z. y) R
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
9 r6 G' G/ c* @ ix = 2;
6 M1 x$ C7 h: @1 @: j exitg1 = false;
1 ]- e; C) U7 f+ v- E$ P while ((!exitg1) && (ix < 81001)) {- @) w0 L! k9 ~6 G6 Y5 @) T
ixstart = ix;4 n( f" Z9 A9 b* U
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {7 V- a$ c. t) v5 ^
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];' S; E$ G6 T/ m8 p" A, w
exitg1 = true;
6 T9 @, Z9 i: V0 G& B } else {. x* V2 Q% I! l% u! y
ix++;
: V: g$ ?- e ~( a9 n( E0 x }3 h5 N2 N9 T H7 y& `+ E3 i% i# e+ ^0 p
}3 t% Z' s. |, s0 s. w
}/ [( R% B, z# c' I/ ~6 z
& V( r; W T( r7 m( _2 \5 v6 f if (ixstart < 81000) {6 c% }9 y4 ^$ \7 b8 j; n3 a/ }
while (ixstart + 1 < 81001) {2 R& X7 A7 D0 V
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
7 k9 u! E7 ?& N0 f, n yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];! J6 q/ M, o$ l! z, c
}
3 T. k% t6 U% L* m! p p; c- s2 W, t1 E
ixstart++;' T+ d8 Z! s+ q% L5 v& K
}
: G; p- ^" u. r/ f. R; i P+ } }
; ?( n1 T7 y! ^5 N
2 Y: }+ Y& z/ f8 G; f: f5 q, J yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
) t' z+ x! N( I# l+ d& i; U if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {. W" j, f8 O/ ?4 F4 l4 `! p
yiDuanShuJu_mean = mtmp;
" z0 x% ~$ n$ O$ Z9 w }
- n8 r# L% k% I- C0 ^9 o, l4 m' d- [' Y+ {2 N
/* 找出极值 */
* D& I( @& ?" p3 g) | for (ixstart = 0; ixstart < 81000; ixstart++) {2 ]; Z# d: o$ ]
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;) r1 `3 j# Y+ A4 _4 c
}
- w4 ]0 F" F; c; k' b1 O" } n
& h$ k6 ]$ U" R' o --------------帖子字数限制------------------
. A7 R& b, E9 ]$ D6 a" i$ Z9 n}+ p+ ~6 U1 Z! J
( W4 a2 h6 J3 {) K; \3 P, B( x( c! B! i2 C+ N: S: T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|