|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
3 U* `7 |6 ^; O; ?2 J* H
, {7 F6 @: x( _8 @" r9 ~( K各位大神:
1 I" Y e; E( N; x" }0 p; L 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)3 D: D! a- F$ `$ R, ]- [* j( T2 a
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
$ B2 V" e: p Y: K. j p( W) R
1 L# ^! W5 o& G0 m/ s* h 7 R0 y' |# z. s. j) Q6 R. W
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
# s# n9 N( I3 X6 c+ ~; Y0 V/ L* J7 {& w) b- P* V
并没有其他线程* n1 F' }! I5 n6 l# E
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。3 M1 T* X. ~5 {. v/ n
也说不定是和堆栈有关系。。。。。。
& P' \7 `& @# r3 m* w7 U @请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 |5 `( G# @$ N( q' c: j8 q4 b4 Y- W( L% A( a
, q3 w, Z1 w1 v9 `) v$ S" A, O) V+ J8 F) U% n7 Q, A# u
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
z4 J$ P2 D# R2 Q9 W1 \ [9 i }) _2 F! P& Z( l) Y
, I9 O( c! A: a8 s, j8 |* b/ ?
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
1 `/ o; j7 `2 l1 g static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
$ I& `$ _' F7 N' k& e6 m- P
Y7 z8 Q2 S( m: B: \; Sboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
' R* _! l {5 [5 p3 D const double data1000[1000]) {$ n& u# S7 R; n: ?1 {" P
* p! ]0 h5 X% g$ g
int myfuck;" Y5 ~5 r! o2 C( C# T/ O0 l; D
double yiDuanShuJu_mean;
' P2 j' c* \5 F6 h, Z" f7 H' H double yiDuanShuJu_LowMean[1000];
) e' b& ]3 U* K0 G# _2 Y int ixstart;1 b# p: p7 C2 I5 O: X" \& D
double dv0[1000];
* [7 C; N9 g O. l comm_AGC pAGC;& d1 \; e7 J, O$ S
comm_CarrierSynchronizer pFineFreqCompensator;5 U+ k: w# }# P9 l
dspcodegen_FIRDecimator pRxFilter;& k- ]0 [! @- D0 V( z6 `
comm_SymbolSynchronizer pTimingRec;# t' }$ M9 t& [8 @
comm_PreambleDetector pPrbDet;
6 C, T- N3 D$ O! {! i FrameSynchronizer pFrameSync;
+ I9 M- e0 z. n6 p QPSKDataDecoder pDataDecod;
0 _( W% Q/ Y+ E static double usable_left_filtfilt[81000];, w2 C7 F- y+ ^9 m7 S# L% ^: {
static double youXiaoShuJu_QuZhiLiu[81000];+ h X( X4 I2 f" \! I
double mtmp;
# S% x0 n: h0 z4 Q, x int ix;7 x+ ]. ?2 m1 W' m8 {/ f
boolean_T exitg2;
/ A; _& u: m+ m6 t' K1 F/ m boolean_T exitg1;1 D" F3 e! ^- P, d6 C3 E% j9 y: u% h! o
double YiZhenShuJu[800];
- p7 M* o4 J5 c double dv1[800];
, y# ?2 W, D! h( r0 w- T( w
( B* I0 O7 W* S+ Y$ q9 w. p% y* U6 U# g7 [
double b_YiZhenShuJu[800];' [9 ~5 }. Y$ ]& `8 |7 o
double I_filtfilt[800];* e) r1 u, {' _1 Q9 ]: M7 j
double Q_filtfilt[800];
6 x% z4 f0 P1 e7 K( T creal_T b_I_filtfilt[800];" x2 v4 k: D0 M6 L1 R
creal_T b[800];
5 n7 M4 b. L7 U$ P& K. Y creal_T RCRxSignal[50];. f r, O3 ^! d1 q3 P/ u
creal_T fineCompSignal[50];
; J6 U& a( D8 i& i double phError[50];* _5 g3 {/ Q" N4 b
creal_T timingRecSignal_data[28];
, p4 `3 w! D5 R( v1 r7 ]( n int timingRecSignal_size[1];) V& S9 R7 O+ Q2 e& M$ q
double prbIdx_data[28];
' P9 ?, ~ o) N9 a/ G: d7 } int prbIdx_size[1];: R& _2 T: O9 O
double dtMt_data[28];
. U% }; Q/ _) L, K# x" h) P: q int dtMt_size[1];$ n5 \, K( |* {% C1 f
creal_T symFrame[25];
- M3 Z: Y: b h: J2 p+ F boolean_T isFrameValid;2 H9 L: U# r. Y- r
double unusedU0[3];
2 a! d; e% L' G* c
6 S3 ]. z6 B6 I4 E4 P& r //调试过程中的变量
5 e5 i7 ?' R. B5 w, Q' ^ int enough_data;0 `/ _: j3 u+ t
8 p2 ]/ z; a; X' I$ o. `) } int enoughDataFlag;! @7 Q1 x8 v# u7 {# b2 y5 x L
int yiDuanShuJu_mean_int;
6 K j- H0 e5 I! P4 D2 D int int_sum_dv0;
% }- r. V1 S3 e7 D' x# o6 D4 X int oo;+ J- b) U3 E, x
int ii;3 B2 s3 }: ^* Z8 `* D, Z
myfuck=10;
( N# i. m: w( c4 g /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */- y+ `' X% t' W5 Z4 n
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
$ L+ v; S& }: u. G8 S; ^1 D2 o
5 S+ Y4 Z$ J% T4 [1 `& s yiDuanShuJu_mean = mean(data1000);
7 C+ o" ~- {# s. w: ~. B( E# N M5 T2 B! j0 ~
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;% v' L1 p+ g* _: S0 T- `4 N. {6 ]
UARTPutc('A');
8 v; r4 g- }+ W8 R' f1 }5 g4 i UARTPutNum(yiDuanShuJu_mean_int);
) H" Y$ K) R$ q UARTPutc('\r');, X# @, P- A4 i( o8 O$ y
UARTPutc('\n');4 J0 z, V+ M' X. H6 ~' m0 x0 y* e
& m/ i! I+ h9 f3 Y1 C5 w& k& ^ for (ixstart = 0; ixstart < 1000; ixstart++) {; b* p+ e! L H. F4 d
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
5 A4 S+ z I% D5 k/ H% m$ } }
$ D+ m S' O( N9 y4 ^; b, z+ v, G) }1 v* [7 U3 b3 Z/ d6 s
power(yiDuanShuJu_LowMean, dv0);- }8 s, l: m9 N: p1 o6 o8 {
+ B# J, p6 I# B- b8 z
int_sum_dv0 = (int) sum(dv0);4 U. {7 }8 T* c; @9 H! W \
, e% N) F/ j+ u% K UARTPutc('B');. H# M- n$ `1 Q2 N
UARTPutNum(int_sum_dv0);
) c2 L/ A! A) p, u* V0 `5 | UARTPutc('\r');
0 K* q7 |, b* K' P1 u0 a& `& s" r" u UARTPutc('\n');# L5 Y# Q6 t7 W0 w9 ~! j+ ?
) J% f4 m$ M" L" }7 {
// int compareFlag = int_sum_dv0 > 1.0E+8;5 K# K4 x2 J* b2 x2 g$ N
) p2 R$ X9 s: @4 K0 O4 y2 { if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?: H: t9 g% ]) f* |* B. o, N5 o
UARTPutc('C');
) A. d9 O& a+ L2 s3 s /* 比较信号能量 */$ x! ^3 Q4 W3 r2 R/ ~8 ?
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
/ x' \( h, I2 K( n ^// yiDuanShuJu_mean = 1000.0 * youxiao_k;. Q! v& X$ v+ x: ?, d3 K
// for (ixstart = 0; ixstart < 1000; ixstart++) {6 B; p: Q6 N, S K$ K
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =: R0 {( ?" `% _5 W, s: \
// yiDuanShuJu_LowMean[ixstart];
2 M7 ^" w4 X' K# |; X// }
" \* b4 e$ \% q- P//# t- C9 r: j! e. Y7 ]
// youxiao_k++;
% J D" l3 x+ Y+ U9 M1 q// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
9 @9 L6 [5 T1 Z' L" ~// /* 感觉要取21个数,即0-20, */' X2 l1 k3 C! F" G' Y. ?$ d
// enough_data = 10;//有效是10,无效是0+ \5 ?, U5 b2 p: F9 c* W3 G/ a
// }& {1 a% z( k5 E* B2 L3 A
}) y! {6 [5 r/ _+ ~9 b* y, d
; }, F5 a* K# q! B+ J# {/ D( h9 i: u' H1 L2 _
enoughDataFlag = 100;, f7 [- K$ a; z
enoughDataFlag = 1000;
5 d9 N4 Q; {. s* K# n; g1 F# { enoughDataFlag = 0x02;
- k2 l P+ w. f9 @! G: K) |" I5 W enoughDataFlag = 200;
5 S2 G5 {2 f! ]2 a
, O# l1 T' V. q0 V' V: S l int myfuvk1;
8 Q" R3 d6 [5 v# L2 {- ` myfuvk1 =11;7 ^. `4 v, q) W, K
0 |, K" r- r# v; L% H# [. f
! i& M* A; G! v6 C2 @. y6 U" M& n: e enough_data = 0;
0 j0 q, m* L$ a& G4 ~8 j! X; M' M
) }. ?3 I7 x4 u# S' J' c& U+ R- N% f' ~// if(enough_data>50){! e: W& _+ C3 L: i; a4 Y
// enoughDataFlag=0x01;
# u" M) K% V6 E// }else if(enough_data<50){
3 h; h* k* u( ]! `! }# O// enoughDataFlag=0x00;//0x00还是不行& e3 t4 [- M: L% L5 n
// }
) X8 }! p, G# J& k' r1 Z; R7 w8 ], p# l* A' _2 J
7 z% g( S }# Q4 o5 p
oo=10;& S9 z: Y5 d2 R" _7 c8 Q2 x3 V& V& B3 N
oo = oo < 5;
* \" @$ I4 _% J' k* Q# C3 f if(oo){8 b- s z# F' a8 a* t {; N9 l
ii=0;' F$ @; D2 A- X9 b' b; j
}
8 N, O M; P( R$ g: k& G. X8 O0 V) Y7 j, I if(oo < 5){
, q+ {/ v" w7 y0 \- N: ` ii=0;
7 K3 Q# n" f4 r; A1 w }
/ W' x. `: l. H2 y' {" ~& I if(oo > 5){
# H5 u4 H* Q% f" n, f ii=0;, x3 U3 e) ?# h6 A
}
1 f1 @; l2 v8 J. t! Z+ M( g5 J7 ] \. E( O
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
& `* l' b8 w9 C9 H( X/ S( h /* 如果数据足够才执行主程序 *// ?6 C" s, h0 M. y# d; w' h) F7 Y
oo = oo < 5;
* `1 u5 S6 b' A enoughDataFlag = enoughDataFlag < 5;
+ }; W8 S$ P0 u+ q if (enoughDataFlag < 5) {
1 v" A: N4 f. {7 A6 }, b// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
$ y9 j* [+ R* D- I! v8 d AGC_AGC(&pAGC);
: F6 q( o9 ~) m4 j3 Y1 P6 l& }4 n k7 T U) Q+ N
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);7 Q# I2 B! [2 \* H
FIRDecimator_FIRDecimator(&pRxFilter);
0 \" T: H9 n0 O( Z& N4 h+ q
: l' Y) v: V" ]! t: e /* Downsampling */1 W& Y8 }- x: K2 _& s
c_SymbolSynchronizer_SymbolSync(&pTimingRec);7 f% i, C3 _& ?5 Z) x1 y% u- x* |4 b B
8 _, h4 E% g, F! m9 k7 u
c_PreambleDetector_PreambleDete(&pPrbDet);* \" ~" m2 W8 B" w* G) l7 H: i
. c( T; Z2 Y2 X; _
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
& b% n. X0 }$ t0 s /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
# `7 m! u4 p, ^% R0 v /* %帧数量=100 */& Y' H2 Q+ W* O. p1 V
pFrameSync.isInitialized = 0;( O, o& \; p, [
3 T# X; M$ K( d6 \. R1 R. w& ?: K /* [EOF] */) D3 w$ ]. W8 o" G! W: X: J- R1 l
/* 前导码长度是13 */) p; R0 ~. U ^
/* %qpsk */
: x8 _8 i) f6 l9 R. W! o6 Z pDataDecod.isInitialized = 0;+ [! [+ ]& M: T k
2 Y& ?! D% Y8 ^% n0 S* k/ o6 J
/* end */- W6 a' d3 n A8 i) J2 y
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */; P; e1 j* r+ W$ N" B2 y+ B0 ~+ s
/* Convert 3-dB frequency */* A% E- {' T+ }$ u1 q
/* Convert 3-dB frequency */5 ~' h0 e) k+ a. n5 ~9 j$ @+ A
filtfilt(save_buffer, usable_left_filtfilt);
3 v9 Q" k1 l( H for (ixstart = 0; ixstart < 81000; ixstart++) {
* C3 \+ T5 w* |* a2 R8 z4 B usable_left_filtfilt[ixstart] *= 2.0;
2 ?' ]7 l% D0 S! z% D }: R2 P! s/ C3 b3 N+ O
2 P, T; i8 c0 F& Y( f
/* 注意乘2,处理幅度 */: u$ C* T+ K! h: V/ R, u. J/ G/ b
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
. v/ `5 y; F; D: ~: t P /* %% 行列转换 */
" @/ P$ v) g6 t0 j' @ yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
4 v, H1 N1 Z# s. G4 R; }& x for (ixstart = 0; ixstart < 81000; ixstart++) {
0 t+ S% y3 D$ S youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]( t3 S/ t. `$ p% a3 P2 Y
- yiDuanShuJu_mean;* L( y/ J4 Y2 S* c; U0 ~
}
N: x$ @( Z7 N: z; m+ Q9 T" W- s4 K, H& p
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
8 O. }- R* m6 I6 N: h7 i$ q ixstart = 1;
) o/ m3 X5 ?# Q" E' ]2 i" `- r mtmp = youXiaoShuJu_QuZhiLiu[0];2 ]& D2 f5 o4 o6 Q4 ]
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {4 E, N' q+ O) K
ix = 2;0 B" Q9 d, M" u8 I8 d5 m
exitg2 = false;
, Y& L, U' s7 T& z5 J! b2 N P. X while ((!exitg2) && (ix < 81001)) {
' C% I! r$ e) ^: F; {9 L i ixstart = ix;
- }' B* y8 F& j% h if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {% _8 [% f/ g) `
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];1 d; @$ @# Y3 h- b
exitg2 = true;. w/ M8 t! y# ]+ y2 D( Y1 j% J
} else {/ S" C# _* |' R* g: Z( W) S- g
ix++;
; X% a& M* n: G: [ }
5 p$ J' L( j! E$ B5 w$ G' f }* _6 e; f* u. O) F9 `" Z6 Y3 ]
}! A# ^. M6 l" B, h9 V0 x
# k* ?/ A) ~- b! e4 o3 _ if (ixstart < 81000) {
3 D+ x. d$ @1 b6 ^ while (ixstart + 1 < 81001) {
! w, f6 {& Q ` if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {* t* H# o% ]& F8 h: g
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
% g- J! q: y) j) t. s! w- ] }
; k3 W9 m0 }2 r1 q5 a' X/ l. U/ H/ [; [; w% Q) @' X
ixstart++;4 n# m& J6 x% L" o) G7 H2 N
}
2 U/ R7 N2 q4 x9 V& W }
7 C, f$ S8 m K& f% S# O: H6 b
3 O( q$ R8 ?' ?( D! f ixstart = 1;. D1 y: Z1 |' W- ~- R4 R2 Q+ N
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];* e; V' h! z, I& _) P/ W
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
& k! D7 F: C9 D9 f8 k ix = 2;
! D U9 a- F& o( Q8 M exitg1 = false;
% I9 l4 o+ _ m7 b6 A while ((!exitg1) && (ix < 81001)) {1 m }2 O# H6 r) O- T1 a
ixstart = ix;: S7 |' u* q2 H7 b& O* l4 j
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 r+ t6 b6 l3 t* d t
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
+ h8 j! g0 o. m& _" H exitg1 = true;
1 I4 ~; X7 c* Z- s/ K } else {
5 a3 `! V u: a+ a* `$ q% [ ix++;
" w+ c9 }0 x4 A, {3 C }' d- e* k; z2 v& G0 C' e/ h9 q) v
}
0 w0 s+ Q% z) J( q# | }
+ ]; A7 s2 e$ |5 o @2 ~, h6 e2 o# R9 c
if (ixstart < 81000) {0 W$ w* e, r2 A/ d% {' R; O
while (ixstart + 1 < 81001) {
9 v; J: M E, E7 O7 G( a0 q if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {$ d$ x6 {( Z r7 \, }1 @
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];0 R! Q L; @3 d$ ]
}
+ r, @6 B3 p7 ^
5 p8 A8 J& I5 c4 _9 q" z6 r ixstart++;
& d) K P( x! Y* v3 z1 O }: t7 G2 B6 r( Y8 I3 x
}
! h1 @3 D1 G7 u+ L) Q3 o: F( E! S9 f4 K# i/ l- F+ E# Q
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);$ i& U5 T/ E' e. w, F9 }; g& f6 |! \
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {& F% c3 Q- P& ?+ Y
yiDuanShuJu_mean = mtmp;
# d- s7 x& D( q8 Y/ N. l5 W9 j5 `8 k }$ v0 T+ D. O: r4 V9 L8 a9 q
2 D7 M1 `. p. o+ Q4 o /* 找出极值 */
1 A6 {1 E, h" G& r+ g" L4 r/ C for (ixstart = 0; ixstart < 81000; ixstart++) {7 d1 @, d/ A( W0 |& R4 P' }
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
- v; k: i( g4 z/ O( B! h }
6 n) [0 Y' _+ S6 K) B& U6 U$ q+ `! _! \. X1 U c) \
--------------帖子字数限制------------------
% {( q9 t% o6 i}# S! I+ [. ?5 j* D! P" m
$ ]$ k9 S, C' T: U
* J: a. [. B, Y6 B, N, ~* a |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|