|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
+ Q9 t: u2 z* e/ u, t. e8 V1 i4 U3 M4 b
各位大神:
9 J9 p2 H+ |+ b8 } 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
+ o, _: m' ?& ]0 d6 o 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
8 w1 O) ~& [- K' w* h: P2 l
# N% K" T3 Y/ T, t/ f
6 v1 Q. o0 P4 K4 Y这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
) e2 ~3 ^% p. s8 ~/ r3 C6 Z
( [; `: L; u- [, k/ z) P) m* f8 ^并没有其他线程
6 `# p( V$ w; Z B L* X u& ]反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
- M- m5 a1 B5 h7 K" d8 W也说不定是和堆栈有关系。。。。。。 o6 G' z' q" W/ O& A$ ]
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
$ ]- P& K* n( P; B& u6 ^& n, a# o! ?) B1 W7 P' v p/ r
' u& D' a- O. d
: @0 }* A/ \/ x6 [我也很绝望啊,希望大神能帮帮忙,感激不尽,!8 ?- V5 T( R+ D- L1 |& {; k* A; m
4 G+ Q# B' k* Z
4 g& H3 d9 v$ d" E" H- M: H附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
& m L2 }0 L3 g7 Q$ P static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
! W/ f- @ T7 T/ l# I- z/ ^! \- {) E, Z
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
! B" L8 v6 k/ J# E const double data1000[1000]) {
+ y7 W; j5 }# _0 A5 V. _. x3 l$ I( m1 l0 _
int myfuck;
3 V6 Z T% M9 V2 X7 L double yiDuanShuJu_mean;' y# U, }+ t) Z* Y: @* w
double yiDuanShuJu_LowMean[1000];, V; v3 i3 i) y$ ^1 X
int ixstart;
6 l( t. N2 Y, Z, L9 f9 k5 [+ u double dv0[1000];
$ w/ p# u0 Q6 {3 l: ? comm_AGC pAGC;
' R. N# b t. q" w comm_CarrierSynchronizer pFineFreqCompensator;) ]% j5 E& K$ P8 y8 B4 n
dspcodegen_FIRDecimator pRxFilter;6 {! Y, r0 D5 e
comm_SymbolSynchronizer pTimingRec;, b- j1 \0 l! H% w5 J/ h- q) h
comm_PreambleDetector pPrbDet;% z$ W& S& a$ k8 u4 i4 p
FrameSynchronizer pFrameSync;
) ?4 {; ^5 ?; R7 \0 E' a/ X QPSKDataDecoder pDataDecod;8 M" @3 ~( w2 E* _ U$ O8 J
static double usable_left_filtfilt[81000];) Q7 U7 A. J' {/ G7 e- p& H
static double youXiaoShuJu_QuZhiLiu[81000];
2 p- R/ |0 ` u# F a4 P! o/ W double mtmp;2 J$ ~" \$ L8 o% C K% K
int ix;
! ]" Q Z2 B" P boolean_T exitg2;; }" x' h2 z) d, R N2 N2 y) f" N8 w
boolean_T exitg1;3 I4 p; A( u# {4 K3 l* j
double YiZhenShuJu[800];$ q/ H0 X4 D u% K: {0 Q
double dv1[800];
; }6 E' z i8 F
( g) F: A, K, m8 a+ b1 w
% y* T% Y+ `. X" N5 U4 i5 E( n double b_YiZhenShuJu[800];
2 I: z; K9 Z3 O7 a0 W double I_filtfilt[800];. _+ [: B8 }5 \9 S' q# }8 m
double Q_filtfilt[800];
, `( f$ A- H' F' a+ ] creal_T b_I_filtfilt[800];! u3 ]8 u+ ~& C! Q# U1 v: E
creal_T b[800];
; l8 c7 V5 t5 B' O1 _7 V, j creal_T RCRxSignal[50];5 l# V- W/ y- g& \; ?- e
creal_T fineCompSignal[50];! I2 @& D4 H& N6 ?
double phError[50];! M! }, |8 }8 w4 a8 S+ d5 f% v) J
creal_T timingRecSignal_data[28];
, w7 m% U& [, V6 {& N% k; K int timingRecSignal_size[1];# f A$ ]: [5 [1 E; T
double prbIdx_data[28];& Z# S6 _- ^4 N1 K
int prbIdx_size[1];
" |0 W5 j* N) y( j8 q1 O double dtMt_data[28];
4 [& W4 A9 ]; ?: }9 n" Z int dtMt_size[1];* C* [' N) ~$ f2 L2 S
creal_T symFrame[25];
8 h; M0 Z7 y. N+ x! X% ^1 @ boolean_T isFrameValid;
* ?& O7 e/ t+ d/ H1 w# M double unusedU0[3];
, ~$ U: W8 ~8 }- }( u1 \0 m% j) ~, S# u5 G# m$ f5 A g" D. q2 H: N
//调试过程中的变量3 c3 k a# t5 Y, U5 h; n2 t
int enough_data;
% p6 D; \: y6 Q h% l7 q2 f9 I6 C( J$ G2 ~+ Z" @% V. y5 Q
int enoughDataFlag;
4 e1 J1 D5 s& F8 j+ c8 M int yiDuanShuJu_mean_int;) v7 M8 ?; h% c& I
int int_sum_dv0;7 ?' ^$ t; Y+ O4 I4 z
int oo;3 _0 m$ S g: I9 d- g/ d9 m# |- S
int ii;, }, I% T+ I9 a" K. a* n
myfuck=10;( }8 B: d1 [# m9 C; z0 q3 j4 n
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
0 [" {0 d) J+ f* a9 W9 k* a7 a+ Y /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
5 n7 O+ @+ A& H3 ~' S+ W8 ~
' U. e; [3 j* X yiDuanShuJu_mean = mean(data1000);
8 F& {* G, F/ c( ~1 I) i. l# ?
6 U3 ^3 A! G/ } yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
: S' W: r) ~: t3 s' T UARTPutc('A');
! I3 A9 h. K/ v4 Q; z. @' D UARTPutNum(yiDuanShuJu_mean_int);
+ n; i: t& ]; f* f5 i* o UARTPutc('\r');
8 @- Z& ]8 m. H9 ] p UARTPutc('\n');6 v. ~2 t" @# C" O9 P: H5 c) a
1 i4 g: T8 U" X# \
for (ixstart = 0; ixstart < 1000; ixstart++) {4 P. ~1 Z/ f: L0 M- s# ]5 Z
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean; M0 h# C+ z) [, a
}* E" z! C$ ?. {+ |1 f; x
0 ~5 h& l+ z/ \4 I* F power(yiDuanShuJu_LowMean, dv0);, B: @/ a- \2 ?6 p
4 O, P- C9 ]; c int_sum_dv0 = (int) sum(dv0);' m8 p1 o! r5 S- @+ r' W) T% _
( d! C8 p" V. A& C6 ^ UARTPutc('B');
* g0 K9 B4 ?5 v0 x* T6 S8 S UARTPutNum(int_sum_dv0);0 h- Q! s# k- W: h6 l2 p# P d
UARTPutc('\r');$ ^7 e7 O5 }3 _- T0 a
UARTPutc('\n');
$ M& g/ Y6 P7 x( x- Q3 V9 f( K/ Y7 V! ^7 W4 J
// int compareFlag = int_sum_dv0 > 1.0E+8;
* ^! o( F! P: o5 U8 Q0 M
+ X& x9 D7 p/ I1 d; \1 R* _ if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?8 P. G. l O% n5 g2 U6 [! W
UARTPutc('C');
- N3 [- _' y, f. Y* }% l- l /* 比较信号能量 */- V1 r9 R' S" a1 v5 P! l
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */( b$ X, t. \" x8 n2 S
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
9 s& K+ p% s: W1 P. `) \% D// for (ixstart = 0; ixstart < 1000; ixstart++) {
# j2 X; v# O3 ^/ y4 ]// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
' y# N9 t$ u5 P, @// yiDuanShuJu_LowMean[ixstart];" T0 j$ C8 k2 p# j4 r7 ~8 }) ^( W7 M; ^7 I
// }5 ]. I$ ~/ T4 @' L
//
# s" p" g) ^/ V F// youxiao_k++;5 Q7 V5 p: z5 e6 d0 M1 e t% F
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==# }3 d1 t4 j2 i
// /* 感觉要取21个数,即0-20, */" v8 W) @% Q$ U6 q7 j2 f1 Z
// enough_data = 10;//有效是10,无效是0
/ K4 f' J5 \! Y W) K- \// }' g" q! f" K+ }9 U- Q5 b
}
0 ~" I9 p" `3 O4 ^2 w! W6 a5 w( S
( t) X2 l$ {' ?# b8 J- t
7 x5 B; T1 ^' e, B* S3 N: y enoughDataFlag = 100;" X z. l" a) O# f8 h7 v! T
enoughDataFlag = 1000;0 _& _# Q4 T. M% L4 o, y h F
enoughDataFlag = 0x02;; Y' s0 Z9 B4 c
enoughDataFlag = 200;) g6 M. p3 e% b( f# j
3 x+ m7 m' I: }, G; ~9 _' o int myfuvk1;
1 C: [% Z5 X% Y% e" w7 ]- `7 q myfuvk1 =11;2 X0 g/ }9 R" ~, g
" v0 E: ?. s( R3 X D% ^: s
0 x# w/ j' B$ t# o
enough_data = 0;
( l2 {/ b k7 j# X, a6 v0 f; |$ v2 T- t
// if(enough_data>50){
: _8 Y, E+ N$ b# Z// enoughDataFlag=0x01;
7 P( | [9 L" h$ b// }else if(enough_data<50){
1 b& \4 `% j! i* K+ R$ R// enoughDataFlag=0x00;//0x00还是不行
- A& N% }/ i; ~1 O1 z2 ~% m- x// }
! d8 x4 n( Y3 V! n/ s j0 A% w3 \% l$ f, {% f. Q& s
3 J# z0 w z1 U! Z/ l6 }* W oo=10;5 G/ t+ k; B d5 b0 G
oo = oo < 5;
, o+ Q" q r1 ~) q if(oo){
% B6 Q7 R7 T3 t1 c3 R8 z# U0 Y ii=0;2 X0 N/ h% N! n. Q5 l
}
. U& a5 W' M3 {" x if(oo < 5){6 a: `$ m P, M) l# f8 _% S9 w
ii=0;" Z4 r' `3 c, j; W
}2 `( }9 l" e9 I. n
if(oo > 5){5 b9 K6 W2 x. a9 M$ F, {
ii=0;
$ V! w% W: q- l }
H2 w& r o) J) x8 \& {+ s7 p7 v
: I# Z* [* a, t /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */$ X6 M9 E4 `3 [1 _. d
/* 如果数据足够才执行主程序 */5 Y7 y8 j2 | m+ r+ C7 z( e
oo = oo < 5;. h- A+ B s3 a$ Z3 I% w" O0 e
enoughDataFlag = enoughDataFlag < 5;
, R8 u# T5 n. J8 L if (enoughDataFlag < 5) {
0 E, ^+ I5 R0 y// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
; ]( H5 I; c5 R: e AGC_AGC(&pAGC);
/ H( i' g. \1 Q3 U. v- U9 U# i0 `% [) I: s$ c6 B0 Q, ^5 n
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);* ^' Y2 K- p# c4 P: Z0 n2 G) H
FIRDecimator_FIRDecimator(&pRxFilter);8 C* c" Y j0 m+ m; |2 y9 {# G$ ^+ I
, \0 H/ x- ^+ H [' r
/* Downsampling */
2 ]7 y' N3 F% i c_SymbolSynchronizer_SymbolSync(&pTimingRec);
6 l `8 S! K5 r5 m: C
7 ~, c1 d8 f% M8 V Z c_PreambleDetector_PreambleDete(&pPrbDet);( ]4 f- U) m1 n: v9 H
6 T$ s3 [; e; c# J( C# e
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
5 f" o! _4 F/ K5 N; a2 i$ H' P /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */+ @+ ^' z% o b1 k, z0 i, l# O6 ]
/* %帧数量=100 */
- e2 w2 q7 F1 r Q4 d2 G pFrameSync.isInitialized = 0;
_) f. m/ p! J+ [6 d! ~
& e* b8 b$ {' n" H% W) X. D/ l /* [EOF] */# k# |, P* j5 ~4 L* _
/* 前导码长度是13 */5 N- E" O! q3 o
/* %qpsk */
( o8 c! z, ^1 f+ ?' }6 d0 u pDataDecod.isInitialized = 0;
* D/ ]! g8 L* N L7 x1 ~+ v. C3 Q, [$ G
/* end */
7 ^6 w0 R. D; `8 Y! i; A4 G, x /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */& h/ j& @6 s2 [" g" Z+ p4 C
/* Convert 3-dB frequency */) S4 P6 W8 ?% e
/* Convert 3-dB frequency */9 U4 |0 A. [$ ~5 b3 g5 A1 o$ s
filtfilt(save_buffer, usable_left_filtfilt);$ K; u1 S6 _3 ~: z6 B% {
for (ixstart = 0; ixstart < 81000; ixstart++) {! k3 k% s; m3 i2 L1 ?
usable_left_filtfilt[ixstart] *= 2.0;6 q7 e% ]; V! h
}
( F! a5 O4 {2 B7 d- B2 H9 h: w- m; y, a @" P
/* 注意乘2,处理幅度 */( }* P5 |3 m: C- L
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */ _. ?# K _2 T" ?0 H
/* %% 行列转换 */( [& K$ T) z# G9 R2 S/ |
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
* n( Q2 ]% [$ C1 J5 u for (ixstart = 0; ixstart < 81000; ixstart++) {
% B5 S2 R* Y, t- s! H& v youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
! y6 @; \. C8 ^- T% z: k! p' G - yiDuanShuJu_mean;
! Q) D6 p$ ?, [* I }
/ ~2 V6 O( |. d# n2 D
; i" A4 g& u6 f1 F* w) G- L /* %% 应该对数据归一化,但是这一步放在哪比较好 */
7 |& v- {: G9 L, C" T; k- c ixstart = 1;6 q0 o* A3 m( a5 `* O v6 h
mtmp = youXiaoShuJu_QuZhiLiu[0];
$ z2 ]+ W1 o+ o if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 h# G: n5 e: D/ T3 p ix = 2;+ m2 f% y: B6 Q( l% V) M, T! h
exitg2 = false;/ r! e. Q) d: @' N3 S' V) n [$ R
while ((!exitg2) && (ix < 81001)) {& N* q' ~9 u1 W; q$ |
ixstart = ix;# j" B0 N. q6 l% v! J3 u
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {; Z4 C& s1 \8 Y ]- f8 F. O
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];& N2 O! M5 z& ~) ^! t K3 \# B
exitg2 = true;9 [2 f& Q) I5 L2 |6 i6 V8 B l$ X
} else {: w. l# k" x% J, o* c4 N
ix++;
6 S9 |- N: Z, s( F' e }
: ~( v2 |+ m( O }) X4 Y& v; |) A; d
}* |- S1 I" T% J3 J3 a: ^" M& g6 i
0 t* T1 x% f( V$ Y if (ixstart < 81000) {
Y2 n! l" r2 m6 t) v% Q while (ixstart + 1 < 81001) {. z" G; w2 T" L5 p% @
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
$ d4 e* I P( i* w2 o mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
, H6 ?* k6 [; w0 M7 _ }8 ~" M9 ]- x w* p4 m3 S x2 r
' j5 f& h" |$ c5 E
ixstart++;
- I2 Y0 P6 }& y( \ }
" v0 x& n: h9 Q, e }
+ y6 [$ Q8 R) v" m! D: M- @- b! h$ Q/ c# M9 y
ixstart = 1;
0 p* ?9 z% y' h) M T7 S* c yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];- o5 W' M, Q5 {1 U. A) Z9 A; Q ]* V
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# B' M$ a. m" N2 P# E
ix = 2;
7 _0 A& w; s. ?. J8 D2 Y exitg1 = false;' a. b7 ]. G; p
while ((!exitg1) && (ix < 81001)) {% d; R$ @' c5 J: u) ?" w
ixstart = ix;
2 [2 O% M$ w0 T7 H% |& s* ` if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {" }8 u# ]6 j: P. g' A4 c
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];- d1 @* g1 H$ R$ N
exitg1 = true;
) d! f" B1 X6 j: O5 m8 a } else {
. L/ o- H! ?8 G# S ix++;* w. t! A) \" x' ?/ |
}
' j& P/ l7 g: w! U' z% s }
9 y" Y6 `3 S. w$ l& C/ h% O }0 x3 t6 W1 c/ x) {
1 n% ^/ E: H: U" H$ S4 k) A2 d
if (ixstart < 81000) {" f; _6 D* U" A/ z+ G
while (ixstart + 1 < 81001) {
+ M& g8 |! X. P) K# l if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {1 V# V7 f6 M( `4 s4 m% g L
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];* v- J' K8 t8 ^) u
}- p, j+ X6 v% _: S s; h- g: X
3 {& u# R8 x/ \ ixstart++;, C& E, I" I# u
}
/ D8 t$ o6 a6 W4 Z' b1 e$ M2 B }
. }5 s7 \& `- {0 k2 ~
& d9 O! Q% Y& g7 y% Z yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);( I" r$ _. R& }( j% {$ N
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {0 P3 ?% ]1 \: O1 |( w! H
yiDuanShuJu_mean = mtmp;. W F- y% n" N' P- K# i0 f' y
}4 n/ U& T8 h6 u1 N, w$ ], z
% f$ g3 H. m: e& T8 z /* 找出极值 */
1 Q: ?. n, ~" x J; V8 B+ x; Q for (ixstart = 0; ixstart < 81000; ixstart++) {$ @, o- v* o( ]9 ]6 i6 f6 W
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
& s1 O3 }0 Z% N& L1 M* Y }
# g7 U3 {1 F$ u1 o; x b9 C% G- d Q1 [& f" Y
--------------帖子字数限制------------------
* V. @& N$ z+ b* D) x3 ]}
( I9 c: E+ ]: ~1 N* W0 ?1 r% G+ p+ l7 \) D) V1 I" x
& ]! m( P. T8 H6 i# u: E7 d
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|