|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
" F! }, O" x9 C# S$ q& U$ C
4 \5 l' d5 K u& S. f各位大神:
2 q6 X& P* @$ x/ V/ u 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
2 n8 C) x7 a2 r. R 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:, K, ?- {/ |% }- }3 e
3 g' R8 t s8 g( R/ ^' ` ' T% ^( K. t7 F( U
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
! d+ a4 ]0 f3 X% Y6 w; {# d: Z
7 Y8 c; n6 |5 M' c; s" `并没有其他线程, c6 \% L- v1 ]9 s0 e6 `
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。) S$ s2 o' N7 b, V( @/ z' ]
也说不定是和堆栈有关系。。。。。。
) o z, ~! F4 i1 E+ E请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....$ s( t3 N- o! x+ G: |/ v
. ?+ {+ \* j7 o2 d8 S+ g% k
B5 q( |: B/ y
" B5 ]$ }% y6 v0 b9 x我也很绝望啊,希望大神能帮帮忙,感激不尽,!# W F+ L- R4 @$ l1 k8 l
2 ~' {% W* W9 c' A0 k
7 Z- t% m: B0 ]2 V" A6 j8 ~附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];/ E0 d3 w+ s' S- p+ |# u
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
Y" i! t! ^6 P* p4 X1 H1 p
! [. i1 g8 H1 `' [* C f: `7 F6 I. nboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(2 |6 F7 C% ~. J
const double data1000[1000]) {
3 L8 Z: |# {- p9 C4 e2 |* o* R
0 ?/ ]# c: j3 }+ f; { int myfuck;
! d" z, ?( K6 _. h1 Y6 m double yiDuanShuJu_mean;# j. z: V8 [ E8 a9 z) O
double yiDuanShuJu_LowMean[1000];
! F# |- ?9 b% D' ~6 U8 E int ixstart;/ ~) p+ Z v4 ]: q# Q
double dv0[1000];
! A- i2 U: _9 |' m4 ^1 u4 u comm_AGC pAGC;: {# W8 D) ?8 w9 [/ o# i4 q2 k+ Q" J! G
comm_CarrierSynchronizer pFineFreqCompensator;
" A1 P, N! q3 m; ^* d9 i dspcodegen_FIRDecimator pRxFilter;7 Y6 i/ B4 |8 J3 b& z( T2 k! G
comm_SymbolSynchronizer pTimingRec;2 r2 ]) W/ u3 i1 I5 m1 Z
comm_PreambleDetector pPrbDet;$ y# l6 m1 O( b7 \
FrameSynchronizer pFrameSync;# q& C1 }8 q0 o
QPSKDataDecoder pDataDecod;- }/ f3 V- q7 l) @; K7 V6 g% l% m
static double usable_left_filtfilt[81000];
/ P F" m, I4 y& f& t static double youXiaoShuJu_QuZhiLiu[81000];% \$ b+ k; ~9 I( }4 J9 _! m
double mtmp;
( T3 n3 d H( l% D int ix;/ _6 J3 y# }0 V% o: T% H
boolean_T exitg2;
$ K# @2 A+ q) W2 _# B5 G; r4 F+ n boolean_T exitg1;& W, L- X% K0 a# E+ s
double YiZhenShuJu[800];
/ ^3 D: j' P+ D4 X5 V; B, A# o double dv1[800];$ ]: b" U2 j- X9 a$ W4 I5 X6 J
& j/ m9 y' T3 f& c" O; P
: x0 j2 k5 ]' y5 h+ S( }0 H2 i! | double b_YiZhenShuJu[800];
& a; O% S( H! \ double I_filtfilt[800];1 F7 O( L; L1 F. r
double Q_filtfilt[800];3 K# B# W* m: ]0 P* F
creal_T b_I_filtfilt[800];
" G: H' [' t: l( A; q& p. @; p8 ^6 { creal_T b[800];
) q3 M, @' T. u# m9 @5 C: a7 m. |1 A- \ creal_T RCRxSignal[50];& l, c2 l p4 B7 |$ f/ y% Z+ K
creal_T fineCompSignal[50];
+ _1 T, d* i5 I' q; e double phError[50];
. I/ w# s+ t# }4 ^1 Q* W. O creal_T timingRecSignal_data[28];, M, p9 |8 \( L [
int timingRecSignal_size[1];0 i, J3 C1 x2 x
double prbIdx_data[28];
: |# a" x' K% J* u int prbIdx_size[1];
6 J& t8 w$ i" V4 ?' d$ F) } double dtMt_data[28];
$ ^3 h8 R: ]. I' c8 P- C* ^) f7 R& ` int dtMt_size[1];
9 j( Z! ]' ~' |' Q: w z3 a- M" u creal_T symFrame[25];
" L4 i% @8 H& ^$ r' ] boolean_T isFrameValid;
$ a! j6 Y4 n7 e2 d- ` double unusedU0[3];
9 q- {7 k) g; R! d) A# \; }- d, u0 R$ i7 Z* X8 _8 K
//调试过程中的变量) ^; O( O1 S) m4 `: v8 K9 I! p' g
int enough_data;/ X+ l* S" i: g* N2 g v1 X) B
9 G, p9 `' I {5 ^
int enoughDataFlag;( R2 a4 e. A. R& U% j z) v1 s
int yiDuanShuJu_mean_int;6 k/ m# R! `+ t& [. g
int int_sum_dv0;
* E& J5 T* \$ B% g- h int oo;: V4 P- S6 r) Q9 w
int ii;7 V. z: C) i; y9 A4 e4 x
myfuck=10; k1 v+ o0 g, [) V4 e0 N; K) z2 i& D2 s
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
: a% E2 n; K+ z2 } /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */$ s8 L* H; k5 g: g4 {: I7 \
# }( F1 T0 C( ~ I/ j' p+ w
yiDuanShuJu_mean = mean(data1000);
3 }, v* V e5 G/ `/ v
2 \, V% W$ M) } yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
4 `5 L' `) F' v4 E UARTPutc('A');
; E& L% F- \, |) U UARTPutNum(yiDuanShuJu_mean_int);- M* n Q9 o; D4 K3 m
UARTPutc('\r'); l$ W) f: B A& C: T
UARTPutc('\n');
4 o$ R/ _1 a; H+ D: [9 m, z, D }3 R! W/ c1 ^5 @
for (ixstart = 0; ixstart < 1000; ixstart++) {, W1 z0 E5 F& z# I% V
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
6 ^7 Q# t' U1 g }4 z, g8 |6 v2 L; C* S/ s! P
& ^$ `5 h* y" O- a9 q* c
power(yiDuanShuJu_LowMean, dv0);
# u. T7 z; s4 B5 R& ?6 {3 i
1 J/ K+ O) S6 x7 {# a4 H; p& M int_sum_dv0 = (int) sum(dv0);
3 O+ ?2 ^7 }8 O# M1 Y( g$ Y7 O$ k' o* Y
UARTPutc('B');2 l3 Y8 b4 ~% P' f. s
UARTPutNum(int_sum_dv0);
' j* B5 g" z5 I7 X" R- d UARTPutc('\r');! @1 p( l! u, E
UARTPutc('\n');
& n, t1 Q: n' ?( Y# p5 Q0 B+ |$ Y2 V) u1 z2 m/ i: v3 m6 }& i
// int compareFlag = int_sum_dv0 > 1.0E+8;* O& d+ Z. A3 y$ _) \3 z
2 ?& w+ \* ?. Q" Z9 _
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
6 U0 J4 L! ], x/ k. q UARTPutc('C');: x: U2 B2 r5 L, `! F$ S1 J
/* 比较信号能量 */- E1 t8 q) x2 m! ^0 F) z
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
$ T) u) E+ b% y" H' A// yiDuanShuJu_mean = 1000.0 * youxiao_k;+ g3 t ?3 t; V2 j8 I# [' W
// for (ixstart = 0; ixstart < 1000; ixstart++) {
. ]- s/ n3 y& M7 d m6 t" l4 S// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
" X- c( Z9 k* o// yiDuanShuJu_LowMean[ixstart];
, \. z7 Y# y( W4 t// }
3 \, }( I: ~" _, d* r8 `//# Q6 v& P3 u. o K3 d
// youxiao_k++;
+ c9 w! R% o6 s1 A: ^1 H// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
3 n7 e' M- i. |, M. I. K" X7 U// /* 感觉要取21个数,即0-20, */- r9 b8 ^4 K( _
// enough_data = 10;//有效是10,无效是0% Z+ @. i& u$ h# d
// }
" l5 C/ ]- a; V }
: g& x" j2 {9 \9 [0 v
8 e! T( ?1 C- `, A: K" ?! J' b! @* t) w
enoughDataFlag = 100;
; Z, L- c0 h! F" a enoughDataFlag = 1000;
+ q! U" \! ]$ Z0 h* y& ~ C5 z4 f enoughDataFlag = 0x02;
h3 v. ^7 ^; \8 T" }! Q8 Z$ N, T9 r) P enoughDataFlag = 200;5 p* A. E: P0 \
5 |+ l0 q: L$ o) }+ W3 a
int myfuvk1;
9 `! S6 H p0 U8 ?8 p myfuvk1 =11;
' X8 ]. \' O Q" N
8 ~! C9 R( d. N5 f% Z, v, e$ Y( h0 o4 H+ j
enough_data = 0;
5 u+ k1 p. C0 v0 r) _9 R( H1 u
c$ ^5 ^, \9 Y T$ t- s) {' a// if(enough_data>50){+ I+ o( K8 D* z' W5 D
// enoughDataFlag=0x01;& l3 W9 r- |+ J/ [3 ]! ?( Z
// }else if(enough_data<50){: N( V$ e& A9 |" X/ i. w; h5 t8 s
// enoughDataFlag=0x00;//0x00还是不行
) G) m, \$ |0 D7 I// }
1 f4 D+ p- A& g- G( z' K. T2 Q/ Z3 P/ l; U- D8 G# l
2 }2 H2 g2 u$ Q2 P: _: b4 Z
oo=10;
- S1 N% n, D3 f- \ oo = oo < 5;7 ?. l5 Z7 q& ]# o
if(oo){
5 R% a( T1 `1 K% G0 b* D, O ii=0;7 J" j5 v: ]- R) T: }4 J: ^) E
}0 I* c6 j7 X3 Y6 l& l7 A7 R
if(oo < 5){% ^3 x3 S7 J' N" M6 g
ii=0; T4 o1 [& W. N8 M
}
( j2 w4 E! o/ k' m if(oo > 5){
/ Z) a/ T$ W& a7 z& B7 {" p9 C) P ii=0;) h: _2 B* p) X2 c) g2 m$ f! k$ B
}
5 P, ]+ q' P8 K+ i6 m2 W* F5 u/ ^- j0 Y2 V- f" X1 w
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
5 A7 p# `' x4 g /* 如果数据足够才执行主程序 */
3 e- e7 p+ S; X oo = oo < 5;
, `2 P8 _* L' B2 N% W enoughDataFlag = enoughDataFlag < 5;& |- \, \5 Z+ a, J$ Y& V; c' g
if (enoughDataFlag < 5) {7 d3 Y0 i4 ^3 H$ u4 b; k/ \( w
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0! G: p7 w' x* a4 n( k2 i" K1 H& @5 V
AGC_AGC(&pAGC);
6 `. T+ C' L! P. d. x. I/ p" h9 Y" j+ k7 p' _. H
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
3 N3 W7 c5 A( T6 N ~* e, j4 r FIRDecimator_FIRDecimator(&pRxFilter);7 M" M, e! i/ p$ X
" s; P0 c) Q1 \0 j1 S
/* Downsampling */
g3 @" ~+ M2 F0 w; p# Z* A c. a c_SymbolSynchronizer_SymbolSync(&pTimingRec);" E, Z' W- A' e7 I b9 S$ u! q
) j8 i z0 i, v" A w0 o5 j
c_PreambleDetector_PreambleDete(&pPrbDet);
, u% L) [; j5 O @* l4 k9 P0 e; k Z, Y% L5 y
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */. w Q' Q/ y9 S6 E a w
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
6 ~$ B/ C! Q9 \- `& K" K /* %帧数量=100 */
: F4 e, H0 c9 g" G pFrameSync.isInitialized = 0;
" P' X2 {* P. [" R# P* c @( n! J/ ^
- I8 J" B# E, y1 L/ w5 a /* [EOF] */- \. O: T x* J* G3 E* a' O
/* 前导码长度是13 */
5 x3 t% o+ b# [3 t5 b /* %qpsk */
, u- H% G4 P7 S# v; g' o7 Q pDataDecod.isInitialized = 0;
6 S8 D8 v& |5 _' i9 A1 d) ~$ H
$ X- W( P/ B" z9 R6 \ /* end *// j! a; l, J& X( x
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */7 {; W: D4 m. Y* A F, s$ U" }0 `) d- a5 S
/* Convert 3-dB frequency */
! T' ^% I5 d1 M, H /* Convert 3-dB frequency */0 |! J& r! ]# E5 e
filtfilt(save_buffer, usable_left_filtfilt);9 u q- ~% S' }
for (ixstart = 0; ixstart < 81000; ixstart++) {1 l- ?; k9 V: v8 ]0 `
usable_left_filtfilt[ixstart] *= 2.0;
) a5 E& P! q6 k1 g }
$ b7 B) H5 p$ a( B$ H2 B% ^3 n- \0 C1 Y
/* 注意乘2,处理幅度 */
! n4 I9 y' k2 N( Z' o6 q /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
: ~ P& @8 K1 m8 @( @ /* %% 行列转换 */
4 }9 j5 P: T5 Z7 ^0 L yiDuanShuJu_mean = b_mean(usable_left_filtfilt);6 y2 X& k( @6 k4 j) @ s( \# e
for (ixstart = 0; ixstart < 81000; ixstart++) {
. P& [' o- f `7 A youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
" k4 D6 X" k! [/ g. _7 C& o4 a$ F0 z) y - yiDuanShuJu_mean;
2 ~: y4 ?3 R3 m" ^9 ] }( X# O8 G' m* u2 U$ F
6 a, d( E" l8 R2 f
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
2 T& ]6 a6 `4 V4 n( N' ]* Q1 S ixstart = 1;
' ]/ _7 k! |* V3 }& O mtmp = youXiaoShuJu_QuZhiLiu[0];
/ Y$ r3 I8 |$ r7 ~4 o if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {% A1 c( b; d: t/ M$ ^
ix = 2;
6 X4 t) t" K: Z5 v exitg2 = false;( z5 `# j) x$ d5 v6 S
while ((!exitg2) && (ix < 81001)) {
4 j* l* X' O( r; h ixstart = ix;
3 z# l- @2 T3 Z6 a- o0 S8 P if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {/ \" k3 s+ R( X1 q
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];& U) b/ `$ P( j2 G
exitg2 = true;- C8 T. J# f1 o6 }5 @! Q: P
} else {
& ^& t' t; h4 x9 i, A- X1 F ix++;' I7 Z1 @ o0 q: u
}+ T9 b, i1 G8 `- ?
}
9 X- B" S: _- R, H" \+ q) { }& W! r" _5 \* k$ E: I y& q
% X2 v( k8 g$ T, O& g
if (ixstart < 81000) {. ?/ X7 [. V. e; }
while (ixstart + 1 < 81001) {
7 v! O% d) H# a3 |" p if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
, ?2 n6 z2 ?+ O) l mtmp = youXiaoShuJu_QuZhiLiu[ixstart];2 G: ^! \0 f. k8 e' S/ ?1 ~
}& N! R. G& Z0 W; b. I
# j# G$ O# C6 m: R8 n ixstart++;4 P" v Y( i1 T
}
" n( b3 d7 E9 Z- M% A0 ? }: M# Y# \$ V; C+ a+ w: S: L5 |
! J7 S. E& n" E( L+ n- g$ s ixstart = 1;
" B4 v6 i* f: l. |5 R1 h# ] yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
6 l. v2 l+ F% y! E/ }" B if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {$ o6 G& C, B1 ?5 ?' {
ix = 2;
9 E. D3 _3 ?8 H4 p4 V2 Q exitg1 = false;- t' [2 v4 o, v
while ((!exitg1) && (ix < 81001)) {# b! m( h2 t; k$ [7 L ~
ixstart = ix;
& r5 G; ]: v7 r" a if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* w! @/ Q8 g) B r8 R! j" A1 S yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];* I, X- q, ]" K$ q+ a& s1 n8 |& J
exitg1 = true;
1 w( V. O7 F1 W/ s' C0 g5 n: }/ \1 U; a } else {
) N) T1 n* L H ix++;1 Z2 ~: p8 o+ |, i5 G
}1 e& J9 P" @" @- Z% x8 G
}/ h+ I5 V& K O$ q( ], ?* |
}
3 }* ?$ f" ^2 H6 K! |
" S: @7 j& d! l1 p+ x3 ^ if (ixstart < 81000) {2 U! @ R" }% p8 n5 ^
while (ixstart + 1 < 81001) {
+ J& H% q* A( \% c$ h2 c# n K if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {1 o1 {# \; a# U' Q2 I6 z
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];8 e3 B# Z! t5 m7 Z
}
9 C/ R- ~, G& l1 c. A: ^, \2 B1 \/ z1 M4 a6 P
ixstart++;
0 Z& O. w9 P! ~3 W }
+ q1 u5 _( X- ~ }
2 [. b- G! N9 l0 h- e" |2 q+ [* |6 ?- i) p2 {$ B" |1 Q$ n
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);- l. f- [7 ~0 g
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
9 _1 l2 S A1 R" I$ b4 R yiDuanShuJu_mean = mtmp;
6 W, U/ }4 x- w& W8 s$ d# H; k }
. e# j% Q3 R3 a2 ^1 g
v. v* y7 ?& k2 H: @ /* 找出极值 */% B0 p+ I5 ~: q2 v3 F7 Q: J
for (ixstart = 0; ixstart < 81000; ixstart++) {0 ?6 S. C! I4 t# @, q/ x9 g: o
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;* P! d! V% \- ]
}- F% a) j$ P Y) V5 L1 L( t! l/ l2 W
* j6 p" f& n- S+ F
--------------帖子字数限制------------------2 l$ c3 e& f" Q6 n: ~) p
}% t+ r; c6 u: g% W
9 `6 v" k& m' k9 S
. P4 e0 L3 ~& X s7 Q6 [+ g) d% z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|