|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 1 X: S: r; P4 v+ z
) M$ P) U- ^% Z; F7 Y4 v" [各位大神:
. l& l* i9 i" ~ y8 d 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
" V8 `" N+ j/ ]7 }' g 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
8 r# {9 C( Q7 _8 d: H0 ~. { _, K2 H1 W# ]3 f9 r
7 g! `2 @7 s( }1 t这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。- B$ ~# K5 F, i$ O! S5 |" Q4 x
( Y9 T8 k& i) u m并没有其他线程0 Z! k( }' t- v$ P
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。: C, b6 _- s0 |6 Z
也说不定是和堆栈有关系。。。。。。# v" B5 ] _/ _+ A
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....9 F# f- X, b# ~6 _. x# w. w3 l
) d% ?# y% J7 y$ H$ I, F. S
3 g" e4 j9 N5 v- i
6 w( ]* c! r- M9 A$ a- O) v3 O2 v
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
+ b# G! T/ B8 Y" |- i
7 K2 [$ z" S& Y# x- L( y9 Z
" U' o7 R/ ?6 X, J* A/ g2 |附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
% V" v' J3 I: ^* _. L* Y static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
/ Z9 O& Z, r& l. y* e4 I9 r( [' o+ }( l" I' O
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
5 x, z [0 R3 f8 L, W const double data1000[1000]) {: t# s% Q) G- Q7 Y
& q, V# u0 [! f' d" G/ `- ?1 Z int myfuck;
4 U- o6 U' n/ Z* c double yiDuanShuJu_mean;
9 x$ [! z7 o0 { { double yiDuanShuJu_LowMean[1000];
! x% v. @9 ?( Y8 _: I; P int ixstart;
8 o1 ^, }/ s5 {" p) Q double dv0[1000];# u3 ?1 [$ o; ?; K+ c% L
comm_AGC pAGC;: @; j& `! }. g* A8 n' q4 O
comm_CarrierSynchronizer pFineFreqCompensator;, W; }" p: R& K, B' o5 |4 ?+ P. l
dspcodegen_FIRDecimator pRxFilter;+ }2 B1 `( ]) c
comm_SymbolSynchronizer pTimingRec;& B& L6 D+ z- ?* V" C+ m
comm_PreambleDetector pPrbDet;
l6 `' k; N4 G$ V' a# h: H, B FrameSynchronizer pFrameSync;
h1 L V7 H5 [# ^5 r6 G QPSKDataDecoder pDataDecod;
# N( s0 o* t$ K, w' w7 P static double usable_left_filtfilt[81000];
. p# e' k) ` e% k* j static double youXiaoShuJu_QuZhiLiu[81000];; s# I: h& x/ ?
double mtmp;
( k. |: o4 Z8 t1 X6 o& ` int ix;
' [8 r$ ]+ f, O boolean_T exitg2;' x! u1 T" V) O* n
boolean_T exitg1;
: o+ C2 R% f/ Q; L/ _9 Y double YiZhenShuJu[800];
) X) r8 O" Q2 N double dv1[800];4 A4 L4 m# I4 D Q
3 h, h" W# g3 I3 }# N
) n: B+ v/ s& [& c, K& \, e double b_YiZhenShuJu[800];
! t0 G7 Y% G6 c double I_filtfilt[800];
- v$ J# P7 [( t8 ?! S7 y6 U9 J$ F double Q_filtfilt[800];1 n% X* j# R3 M! T1 n! A- L
creal_T b_I_filtfilt[800];
! g' C9 }8 y. f! L' r creal_T b[800];
; J3 Y3 c4 l- x1 f* _$ A creal_T RCRxSignal[50];/ b2 [5 a* t% d4 [7 X
creal_T fineCompSignal[50];9 y5 h; E c z/ [
double phError[50];8 ?% u# }! @' W
creal_T timingRecSignal_data[28];* E% @) m# [8 G ~; h6 x
int timingRecSignal_size[1];/ f( m, |! ?* n. e. P n: D% x
double prbIdx_data[28];" }2 |7 o5 ?% v" A
int prbIdx_size[1];
8 }4 z' p `- `: C double dtMt_data[28];
9 R7 Q0 E Z( j% F% @" V* w int dtMt_size[1];; `, K7 ] t6 T: S
creal_T symFrame[25];6 k, p0 h' Y+ {; d1 i/ R& i' d
boolean_T isFrameValid;
9 K8 N. G& c# ^+ } m# q2 Z double unusedU0[3];
/ W2 E E$ I4 J) D& P b5 ]9 D0 c6 I$ l( ]6 k- |
//调试过程中的变量
6 Q* b. w; C8 D0 y$ E) H int enough_data;
7 d2 E2 J s$ Y- {& I( D( x8 f5 l5 F' J/ J* P0 P3 A. E
int enoughDataFlag;
& a7 y$ O/ ^1 z+ t% i& w9 _ int yiDuanShuJu_mean_int; |4 A$ `2 @4 |# z
int int_sum_dv0;
" i1 ?! o# x# J int oo;
) p# \% Q* L- O6 ]( D4 p8 h int ii;- b1 v6 t4 H0 M
myfuck=10;
. ]7 h& I. ^+ ~. ` /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */, r" w9 w) b( c" n m
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */# ]$ c2 j$ ~1 A: m3 x4 u2 q+ ^% {
. V) g$ q- g- T* k" o& d yiDuanShuJu_mean = mean(data1000);8 E7 H( s9 F8 V) n9 Q+ m
" Y7 |) V$ l- w( A, a6 v) r% D9 M yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
8 g) I, l) m+ j UARTPutc('A');
) ~' K0 Q, l" H6 s UARTPutNum(yiDuanShuJu_mean_int);: z1 V5 m( h4 `+ m! C. Q- } i; K9 a
UARTPutc('\r');
! W j& Y. n8 V UARTPutc('\n');3 z! O0 \6 L) f( x9 d3 @
6 z, U6 |4 ~. Q" A8 `$ m$ I
for (ixstart = 0; ixstart < 1000; ixstart++) {
* S+ \" m: S! v- S+ ?' j& A. A yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;) C) f0 W( d: C; `- N
}" E. ]: U2 W$ t+ z# [
, ]4 N5 t; t5 e$ I; j power(yiDuanShuJu_LowMean, dv0);" k# d0 \9 j% ~9 b: _4 R: I
% h' q2 v: S, Y, u/ @) K# z3 s int_sum_dv0 = (int) sum(dv0);
5 K4 a& M( J) B. [9 M5 I2 D" P6 k
: i# [0 m5 X m UARTPutc('B');) E) A2 g8 E, ^6 x+ @0 A
UARTPutNum(int_sum_dv0);
: ^7 u, Q2 X! n* b% N UARTPutc('\r');$ H( P- t9 F# P$ x& [+ ~3 ~
UARTPutc('\n');2 R& q1 G. U, Y; X0 n; \1 h
0 D% P# [4 j* a$ y' r% e$ d3 t
// int compareFlag = int_sum_dv0 > 1.0E+8;
: v4 o7 X3 ]1 B: ^: Z: }: x7 @" n9 D( E7 N
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?( B& R- \+ [: u# U h
UARTPutc('C');
$ x6 n# D4 d5 ^1 b( m& }1 E1 C /* 比较信号能量 */
1 @. h3 N9 e: w5 {0 q /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */4 m1 g. j' h' ]( z9 E% h" u5 _; C
// yiDuanShuJu_mean = 1000.0 * youxiao_k;, c z* {4 m/ R/ {0 x$ F5 w
// for (ixstart = 0; ixstart < 1000; ixstart++) {
4 m/ f6 z' V+ V5 q# U. B5 ^& g// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =' _3 q$ C/ a7 }8 y/ ~+ i1 W2 z
// yiDuanShuJu_LowMean[ixstart];
5 D) R0 P. u0 G// }
0 Z( _) o1 u# r4 Z, ^( m2 b//
" r$ M, |8 S) ~* g& a// youxiao_k++;* h! f* `9 v# i/ U3 V8 Y
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==9 P* Q* K/ G( Q$ R/ }
// /* 感觉要取21个数,即0-20, */% p( f1 c$ T- S& W) m
// enough_data = 10;//有效是10,无效是0/ V! x6 q1 M/ r5 C4 p4 L
// }
0 c n+ x3 M9 a }
( R* V1 J1 Y/ G/ F, d1 n' p5 `" i" S! n; T0 n
0 W* B8 ^9 X @" B7 Y$ c
enoughDataFlag = 100;3 N9 G% g% F* [8 [4 x6 W1 U
enoughDataFlag = 1000;
+ \: b! f0 e* j% ~) u- I enoughDataFlag = 0x02;( V/ E! r Y% V5 {) c
enoughDataFlag = 200;
9 r4 h4 s' b, u( {
4 I& [ q8 a' \) p int myfuvk1;" H2 z) P* [2 E2 _! b0 c' A- N5 I; I
myfuvk1 =11;( e% k0 N8 {! [1 a( p2 l
' k; R& Q m8 b3 T
$ U+ t9 N" Y) e, c4 _9 z( N( C
enough_data = 0;" B3 y& m T- `) o0 `0 j
% S$ H/ E# j8 y- ~5 ]// if(enough_data>50){! o+ F# I- s( z0 f% e: Q7 g$ |2 b
// enoughDataFlag=0x01;" |6 b' g$ Z! V* a) i. v; I5 A
// }else if(enough_data<50){* W$ I" O6 O; y( r2 `; t5 I8 f
// enoughDataFlag=0x00;//0x00还是不行
0 D# \) M7 x# d! D2 E8 d N0 T// }
: k9 ]8 \/ W7 y9 X+ \3 t+ T5 V8 h+ \, ~$ X9 x. V
& h! N3 E7 N U( N9 S& n: w- v
oo=10;
) ]7 D* g- V( }* n9 D- Z" F5 H oo = oo < 5;$ w: W$ i, o! ~
if(oo){2 |( S$ S+ d- _' n! V9 E, |# _
ii=0;
; Z; f3 b l a3 [" `% p$ G }
" h, N2 ~8 |# n if(oo < 5){
( W; ?4 j4 `% K, |& L& U7 g0 f ii=0;) E4 e) {- ^( A5 }8 J/ M( {
}% L: p) l! _* e0 T+ T
if(oo > 5){
- q; q' h, v% J1 r( G ii=0;
) |! p7 G+ A, i }
) [# I$ u; c- j! x4 d# r. h7 D4 E4 ]" h
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
3 c% B: m( z$ u /* 如果数据足够才执行主程序 */
- o$ Q% c2 W5 ~, u( \1 | n oo = oo < 5;. u, s2 S$ k9 F. Z% S8 S2 s) c* f: g
enoughDataFlag = enoughDataFlag < 5;# x3 }. E* l: M7 K) b! Q
if (enoughDataFlag < 5) {- T! S/ r/ l' }
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
" W l2 F) w( `" q. G AGC_AGC(&pAGC);
6 ^9 Q+ m$ D- L5 \
% y) L& N! m& d- G; w& T c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
9 m$ H6 d* e; v) T5 N6 R) A FIRDecimator_FIRDecimator(&pRxFilter);
- v2 l0 D" a5 N+ c) p
6 D' S: J/ ]8 @# b+ c /* Downsampling *// x4 _6 L5 Z) S% y" I3 \
c_SymbolSynchronizer_SymbolSync(&pTimingRec);7 M1 I; I3 m" M Q0 {
! J$ s/ K3 s2 T* l3 W
c_PreambleDetector_PreambleDete(&pPrbDet);) a, Z. X- l9 k4 c& S& P
8 V0 S0 w' M) R( p3 P- {) j
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
1 S4 S7 ~) q; ~ /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */( h+ C+ i) c0 R' a
/* %帧数量=100 */) M- [0 \$ p M+ J& x s/ f( z9 l2 p
pFrameSync.isInitialized = 0;7 b1 D" J: _( p5 G0 f
9 D' u& c* e5 {$ n' }4 z V, B /* [EOF] */5 q: Q' k) |6 ?
/* 前导码长度是13 */0 O4 M) Q+ ?- c# n0 p# M
/* %qpsk */
. U# e* _8 F7 _) c pDataDecod.isInitialized = 0;
9 ]( N6 N+ }( [& |0 U
; J; ?4 Z6 W& x. @$ o6 Z& o /* end */
. i9 ~( r1 Q" |3 D& X+ Z /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */0 q( X7 Y6 d' s; O3 @- P6 ]" B
/* Convert 3-dB frequency */: L- D/ g6 ]* x8 I5 w
/* Convert 3-dB frequency */0 f! A, `- x( R0 [% }( p
filtfilt(save_buffer, usable_left_filtfilt);
% L t+ l5 I, y* u for (ixstart = 0; ixstart < 81000; ixstart++) {
( ~1 m O0 m/ M/ S- J usable_left_filtfilt[ixstart] *= 2.0;( ]8 Y6 `9 `, C$ ^2 u2 ^
}; }+ }% F/ C' Q( ~/ v2 n" I
3 u; P0 U, B- c. p: G3 c' D% |: ^
/* 注意乘2,处理幅度 */
* v% f5 S9 e3 x! @% M8 z /* %% 我发现带通之后其实就均值为0了,不用这一步了 */3 W4 |/ v) T: f3 F4 G: Z$ S
/* %% 行列转换 */1 P/ Z4 m, A k8 e& q8 E
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);2 M6 K2 ^* _# |; d! G N- F
for (ixstart = 0; ixstart < 81000; ixstart++) {2 j. y# w. \4 v. F1 h% C+ m- U! I
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]/ N1 A' I( ~" C7 @+ y
- yiDuanShuJu_mean;
) F+ k7 T. u2 e" u% Z0 Y4 p }
9 S3 m- n, q7 [+ [7 y1 |
. q) r3 d6 W2 Q /* %% 应该对数据归一化,但是这一步放在哪比较好 */
- e1 x' q, F8 [, e ixstart = 1;# d5 Q+ [: g k8 R7 N
mtmp = youXiaoShuJu_QuZhiLiu[0];7 w) C' _1 D0 W( {. x4 P0 R) E' A
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( [. |7 i( T- u7 L ix = 2;; n1 L( T8 E) Y5 g; h7 N/ x- }
exitg2 = false;
; T- l/ ]) H6 X7 d4 G$ a while ((!exitg2) && (ix < 81001)) {6 ]& c; T( y' Y% p0 w9 L# |+ U3 g
ixstart = ix;5 p, D0 p# C# o G3 T o1 p
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
& W( b. v- d8 \% y* ]# s) N mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];' }1 }. [9 G" L r# g! } z7 f
exitg2 = true;
' @/ s1 s' u2 d# B% p# E( j } else {
$ N8 k3 y3 e9 {. h6 w ix++;
" u5 ~, d$ R& H) q# t }
( |+ }' P* k% C0 z& ?9 j5 l }3 W0 D3 i/ x, i. ?3 f
}" c7 x$ R. X+ U3 x8 a E, k
4 @, ~( k! t7 E! w9 ], L" y2 c" G! x
if (ixstart < 81000) {
+ Y4 s. B! x' i5 f while (ixstart + 1 < 81001) {. g7 v! P9 m5 O% y
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
. |4 c2 O. s l% g L7 J( j) W mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
2 U7 P0 z/ {5 c+ F8 p2 Q0 i/ \- X }
& m0 }2 Q# p% P, l8 [ D! ]) w. U
0 q ?9 s( ?% N$ n) M2 w ixstart++;
, V0 {5 l$ a! n% }# a }
% P d2 i5 n4 J }
9 `3 S E; C4 O0 ?& B2 B( j
6 o/ Y' v: c" W ixstart = 1;" r5 i: o/ q% p C$ x
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];6 `1 m/ R0 N& n3 E) O" k* D' ?
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {( n T" I- n9 I, R$ y/ W
ix = 2;3 ^ ~# z6 [6 ^" Y3 l& r% M
exitg1 = false;
! X: {# M' w c m1 V while ((!exitg1) && (ix < 81001)) {/ U# S( y! e0 p5 e* B
ixstart = ix;
7 Z" P% S. D% b0 h% U if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {+ r4 P. Q# o( D5 B0 a' l4 L, F
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
5 K0 S; Z- V6 J; N0 h" H9 L' E exitg1 = true;
' T( i0 H2 E7 v$ r& d } else {8 k# [& \, @2 v$ r) F" M
ix++;
4 D# ?# \ g3 ^5 W0 p0 J' W4 o }+ C" z, U6 e! s
}! E& b) Q3 o" c1 O; q/ H
}0 L4 _8 C1 X& d. h+ n; K
6 P5 ]: t& V8 {! q, G3 R2 v' R: A
if (ixstart < 81000) {
# D2 Q# F4 ?: h! s6 i, M! t; ~ while (ixstart + 1 < 81001) {
' n# H- _& H' A3 u0 c if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {7 _7 Q& L& W/ l- e: B
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
# |' d. s( I# q: X5 Q! j }. Q. _$ ]' _/ w2 _
( H9 z$ g' T }9 Q2 M3 e) f# B
ixstart++;
7 l( p0 m- M) T# i }
* H" F: b, }$ ]/ ^' `$ A }
# G& B) L( P- {) c5 R. ] j& d! A7 e4 D; u
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);" y3 i+ _! R: o8 i
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) { J C; g0 H" g2 G( x
yiDuanShuJu_mean = mtmp;/ X E' Z" W8 x* M% P
}
- p5 J( x+ P, y4 N$ V& N4 M! J: u/ r& T' G* p6 G) ]
/* 找出极值 */
, _% R, [1 Q8 l: w for (ixstart = 0; ixstart < 81000; ixstart++) {
. g8 \6 ^2 `* n0 ]/ K Y youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;5 |+ R, ?! ^ f# I; J
}
& m3 t& L4 c9 M- p z9 b1 e" p2 O' a, O- h$ n
--------------帖子字数限制------------------
# G1 x9 z8 }7 t: p) w! e}8 N. D6 ]% y9 w! v* i
# k1 D3 ^! e7 T% N u" f
. U8 H: a0 L- Q& ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|