|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
6 t0 \! B" Y5 x
* P4 D; W) R) {各位大神:7 p3 I# C# Q, q% _* O
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
5 u/ M: g/ l6 j2 l) A n 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
: [. Y0 @; e3 J" n. I+ ?
6 j' q" Q; _" U0 i$ l# e ; n5 J7 w+ X3 B2 D& e, E! l
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。2 y- g9 ]3 s' T+ S
/ {3 d0 x# l. W
并没有其他线程4 s9 L1 v& m& ~& u! g& ^3 x
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
4 |: J, R8 o6 Y: o1 T6 T/ r* F也说不定是和堆栈有关系。。。。。。/ C8 O. e6 ?8 t- K& o
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
$ Q6 L3 i8 d! t0 @; i3 s
$ O7 M9 P* I, V6 y5 \ a. _( Q1 H) `, r
& P4 Q# \7 ]$ F! Y$ F1 B我也很绝望啊,希望大神能帮帮忙,感激不尽,!5 U6 _+ D5 A" F" `
$ |1 O4 n* i* n* u u5 J; n0 U1 S2 e
; d2 Y! m- m' {" q& V附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
S8 e4 y4 y; l; a7 w static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
3 K0 L. r0 o; Z: ^) O3 ?) n
$ X9 u0 r+ Y% j$ j! n8 Bboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(; q8 O9 E0 s, ?1 R0 X
const double data1000[1000]) {9 {! J$ Q, f, f! Y: f6 P5 p6 G
; [& b$ K( \2 L1 {: B$ h. v int myfuck;/ [( \ U. j/ y& d L+ M
double yiDuanShuJu_mean;
3 m' M& k( b7 l double yiDuanShuJu_LowMean[1000];
2 y% _" ?) @- m2 x int ixstart;! z6 k) Q/ T) s9 H D
double dv0[1000];
2 b4 g2 ]# z8 \ comm_AGC pAGC;
1 p6 n1 @3 T/ O! }. o comm_CarrierSynchronizer pFineFreqCompensator;& j$ D! Z3 D0 r% d2 y4 l
dspcodegen_FIRDecimator pRxFilter;: r( g" w6 m2 L7 M. j8 J& @9 W0 ?
comm_SymbolSynchronizer pTimingRec;
- t% M @9 d, R# I$ p# Z comm_PreambleDetector pPrbDet;5 s- A% p2 v* W8 K
FrameSynchronizer pFrameSync;# T# T2 z. O" R
QPSKDataDecoder pDataDecod;
5 d! A2 Y2 l/ c2 y. H R) } static double usable_left_filtfilt[81000];
' t! }0 ~0 y4 L4 z9 _# b static double youXiaoShuJu_QuZhiLiu[81000];* n0 ?6 g8 M: v0 O& i# M" s
double mtmp;# z+ H; t- l2 o& }8 {! M
int ix;/ _2 m& ^* |+ C* C( Q/ d" B
boolean_T exitg2;
{. g2 [# E4 I; s0 X boolean_T exitg1;7 i H7 g3 m+ v; _* t; i( @
double YiZhenShuJu[800];4 \( w6 V0 s) `6 H$ y+ N& L
double dv1[800];5 ?- Q2 l; f% r. J- d
% C5 X- ]# l, |( S4 k2 e
F1 |2 X0 l) K; I& V
double b_YiZhenShuJu[800];( ^1 X5 {4 ]& z$ |5 \0 D
double I_filtfilt[800];
2 V# z( }7 Z" ] K7 q- } double Q_filtfilt[800];- M2 G, t/ J2 o* m; x$ A) w- b
creal_T b_I_filtfilt[800];
1 B* A% T8 L- J8 U( N. d creal_T b[800];
# O/ {) o% c8 W6 h* ~ creal_T RCRxSignal[50];
* V0 E) l8 ?) h' I creal_T fineCompSignal[50];
j: _5 }" B5 e$ U double phError[50];, ~, I6 p. e2 m8 C
creal_T timingRecSignal_data[28];
- ?% h( x+ F J4 L int timingRecSignal_size[1];
- t, |$ r# A; N7 b7 J `% ] double prbIdx_data[28];( S' h7 J4 l# L3 z" Z. w
int prbIdx_size[1];
5 C7 v& b: U9 Y/ J4 B: f6 m$ J4 r double dtMt_data[28];' o8 U' T1 @& ]- F
int dtMt_size[1];2 ?; | A" A0 l) Q! u
creal_T symFrame[25];
- D, i* s4 }5 K! [, { boolean_T isFrameValid;
9 V g3 j$ R% L' Y double unusedU0[3];. | |- z9 [+ i O+ {
1 {( r/ i v1 f- e //调试过程中的变量
7 v4 K& V c# }' M int enough_data;
4 ?: o9 D/ s9 n; X3 n+ {6 u5 _3 v/ S8 [7 w
int enoughDataFlag;% j4 t$ U C6 _3 E/ s0 ^
int yiDuanShuJu_mean_int;
6 P9 m* F) E2 l$ U/ U int int_sum_dv0;# B' v( d% ^2 f5 d
int oo;
$ y$ Z# U9 x# u! K; r6 ?- ^ int ii;6 k/ G- o; G* B' Z
myfuck=10;
, g2 E2 L/ B2 z /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */3 u3 I2 k& O8 d
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */' e/ F2 R' X9 n1 o
1 K" `+ B; Q$ G- R3 ~ yiDuanShuJu_mean = mean(data1000);
7 _* x7 c- r s- D: N+ |
9 `4 _# L6 U2 A4 N9 n; } yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
1 M+ N3 D) M, u: D& W& W UARTPutc('A');0 D$ P P1 V6 \$ x: o% \( e4 @( u
UARTPutNum(yiDuanShuJu_mean_int);" e, X- f1 \: T* n
UARTPutc('\r');; o; q) u/ `# x
UARTPutc('\n');. v9 h3 `2 n2 P7 i0 K
$ B5 \9 o( M$ D+ d- T3 L- W5 a
for (ixstart = 0; ixstart < 1000; ixstart++) {, r3 C1 Z9 O; }$ q( V
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
6 N* x" ^( j' m! E3 p5 k }9 ?& e$ r: e3 H' h5 O
) q; Y2 N- V8 k$ L power(yiDuanShuJu_LowMean, dv0);
9 ~% m5 l( R5 C/ r2 j+ R' A7 g( y# p* I# J9 D( @" W% N
int_sum_dv0 = (int) sum(dv0);
- g8 R, c, g3 W! x8 U) d6 v+ h4 g* R8 [
UARTPutc('B');% P! I {" {1 J/ b
UARTPutNum(int_sum_dv0);% f" f! M" {- Y+ f7 O
UARTPutc('\r');! c& X, i/ |% U; l( y. f% K
UARTPutc('\n');: n8 g5 k: j4 Z' `' O( N& U- t
4 G, E8 F3 u" H2 ~// int compareFlag = int_sum_dv0 > 1.0E+8;6 C/ @3 C2 i* q
1 }8 v3 f0 e: }4 Z7 p# Q4 ?' {
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?4 a, |8 I$ J5 h8 `" b
UARTPutc('C');1 N u, b( k- @
/* 比较信号能量 */; i4 u4 f* W4 }7 V3 m; Y
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
# G6 B/ N4 j. @" D# H. @7 _6 D8 h* t// yiDuanShuJu_mean = 1000.0 * youxiao_k;* d% P$ M( @4 |! s7 K2 [
// for (ixstart = 0; ixstart < 1000; ixstart++) {
/ q! ^, s5 Q9 a& @3 [( N2 R// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
7 R" V2 |0 E7 b1 I6 u p6 B// yiDuanShuJu_LowMean[ixstart];
$ `! ?! c2 P1 z, P" t% E// }& @+ Q: d( f2 |" v
//
4 Q8 I1 X; D3 P! a, I7 S! ?// youxiao_k++;: B, N3 Q0 R: O2 o0 ?; g
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
% O- a6 ^" c | b5 }// /* 感觉要取21个数,即0-20, */6 x7 r3 d! u0 |
// enough_data = 10;//有效是10,无效是0
: C4 H( l/ @ k// }
$ V' f# {* T9 S- g( o* v+ V# p+ M( X }9 K/ N& T3 c- ?+ F0 `7 _4 C, o2 t
0 p9 A' R8 `. B# v0 J* |: o6 C7 n& i* N" F; Y
enoughDataFlag = 100;
7 J" c# n( a2 R8 j0 w+ ], f8 F enoughDataFlag = 1000;
$ [% N$ `7 k# r9 P: i enoughDataFlag = 0x02;
: e- |2 q1 T! } enoughDataFlag = 200;
; f% B- t2 F1 \5 o1 {% g# A* f1 Q2 F$ ?: ?% T, x
int myfuvk1; R8 b6 ~- ]( b( q T
myfuvk1 =11;1 q( j! ]+ \+ l# M6 a7 v' F# N$ @
5 e* g3 h2 u. s, v+ s P; S
v* m7 h* s r @
enough_data = 0;
4 E6 Y, q E+ }# B
! [, b- x1 _7 e3 K" e1 @( r5 o// if(enough_data>50){
5 F% n! h4 i6 [. @2 W$ `// enoughDataFlag=0x01;
& m) l7 U. a1 O5 B// }else if(enough_data<50){
7 y0 `6 `$ `" U// enoughDataFlag=0x00;//0x00还是不行
5 C! H% q* ?( W$ Q// }* s7 c# E# S, @9 `/ l# e4 |
) }1 h* r1 A2 o8 L$ w# V5 h- ]( B8 m
1 J1 @; d! a# {7 u; [ oo=10;
* `- `. {9 h+ x" O* ~ oo = oo < 5;
" E" z2 S e0 Y# ]9 q; |+ F if(oo){6 W, ]8 H1 L% { i
ii=0;# n3 Q2 z( Z) K/ N, I
}
6 o2 h, P0 H7 g( Z if(oo < 5){
& M# G- u1 g) |+ {1 }& ? ii=0;
5 b" _, l) |4 L3 L; e9 ` }
9 V' F( `( D" E* N0 l if(oo > 5){$ v) |9 T; M6 d) _% D- w
ii=0;
3 g G3 c5 D1 q" O1 V# ^) G g5 g( d- d; _ }
5 Y4 [, U) s% w
' m( e7 h! M! n8 ]! g$ D( @: S1 b+ N* a) ^ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */0 l% m' y- a- t- E) a3 ~) F
/* 如果数据足够才执行主程序 */
7 D# `& [. k1 U% m8 \8 ^* R5 N- e oo = oo < 5;
3 q' V( }8 Q7 r* S9 b9 V enoughDataFlag = enoughDataFlag < 5;7 b! l" U: Q: e- e* g
if (enoughDataFlag < 5) {" F/ l& `% ?: o2 s2 R+ o0 b$ r" z1 ]
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是07 \6 t) v' q, j8 L& ?/ Y0 n6 y$ L9 x
AGC_AGC(&pAGC);4 h; {9 {9 G# n9 ?2 W9 A
* U6 }2 p; Q% ^5 Y; m- A. C c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);: _0 d% Y/ |, M
FIRDecimator_FIRDecimator(&pRxFilter);
& {( T# K% B9 H' S& _1 R
) G" k: i2 o R% Z /* Downsampling */
1 B4 X3 O, ^" T5 M! ^0 I& K c_SymbolSynchronizer_SymbolSync(&pTimingRec);
/ d0 E& h# B: U- G
2 \$ N' l. s- s7 ^ c_PreambleDetector_PreambleDete(&pPrbDet);
+ Q4 D' y$ c: q' ~
. W Y4 K7 W: n/ b- Z2 L; t /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
Y' O5 f$ S! V$ u5 r /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
$ n. S9 d7 R2 L3 Y* K. _1 s /* %帧数量=100 */* k8 S5 R J0 G2 s3 I) o
pFrameSync.isInitialized = 0;
, r/ }4 O; j2 ]" O2 ?) P
5 ~ v5 z( C/ d$ P/ \ /* [EOF] */! w! }, o$ e7 e$ }2 c# m3 X
/* 前导码长度是13 */
8 P: x m' a$ r) t% d /* %qpsk *// V4 Y8 N4 s- d# y
pDataDecod.isInitialized = 0;8 |: P* Z- i) N8 c. t& h' a, E
, b% D) ]3 V5 o( ^) n6 \1 l/ M
/* end *// e- S" H% X2 b5 y1 P
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */, F5 G+ @( N# D+ e
/* Convert 3-dB frequency */0 v- [; B) W) |/ g4 \6 f
/* Convert 3-dB frequency */
" }2 R5 ~' a) D- w# }1 s filtfilt(save_buffer, usable_left_filtfilt);! K7 ?( z8 y" w0 g$ `
for (ixstart = 0; ixstart < 81000; ixstart++) {
: M$ ~7 r" D' U2 I: G0 R! [" q usable_left_filtfilt[ixstart] *= 2.0;9 E) B: w% A5 ~1 }4 T& S& v
}
7 M* t* B, \& B! n6 A# H8 @( h) w* U9 W$ O+ B x
/* 注意乘2,处理幅度 */9 h( k2 t- l0 e0 J
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */3 V2 m/ k2 d! @$ F
/* %% 行列转换 */
' W- U+ ] M! k+ m, o yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
: a* u: i! M9 y6 M for (ixstart = 0; ixstart < 81000; ixstart++) {
* ^' ^9 K; d2 t youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
+ ]: x& Z6 s) @: @& R g - yiDuanShuJu_mean;! J0 x S5 F! h+ G) f" |+ p
}. P: N0 `) B& q+ f
' o% W3 N3 p I# m
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
+ E7 G* o+ i$ D ixstart = 1;
) c( D) m' K+ g) p* u0 X mtmp = youXiaoShuJu_QuZhiLiu[0];
0 g! e5 V2 p0 | if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
& w8 W X$ x2 Z ix = 2;8 X" r2 j6 F9 d) y4 X" W
exitg2 = false;+ ^& U* A) @) z5 f
while ((!exitg2) && (ix < 81001)) {
, t% b( [6 o' V$ x ixstart = ix;
2 g1 K$ j' X- O if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {" e% o# ?9 i3 `# H" P7 N+ a/ s- q
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
9 f5 `. e' D0 V% X/ K exitg2 = true;
9 f" x+ j/ t0 E" K$ z+ l } else {
" {2 m( F$ S$ s* {7 g v ix++;
% y- b& J) f" R. x' o9 \ }& ?& e8 G! F7 c+ q# O& n' _" S
}
% k( b, w. f B }
/ O; c( O. }; n& P% B
- e& D4 v) ?$ `. o: b6 X4 ?0 b if (ixstart < 81000) {2 [" A* T1 m. l4 l, R3 P+ B( t ^0 G- M
while (ixstart + 1 < 81001) {
[) R. y$ U _ if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {2 D/ {/ \" W0 j/ R8 J# d
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];* ?' w5 o& y( X# f( S( d* j! ~3 }
}6 S4 q% \3 ~6 u+ y4 A* a$ E
2 q( R0 F( N3 J7 {) L5 U
ixstart++;- }. z" `- b6 b
} O8 ~, ?+ q4 e$ t
}# p. J; Z$ `+ G9 F
4 i0 e3 B ]& [" }% j; f
ixstart = 1;' t: v2 X; @. d: N7 Z3 a
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];; `; @0 o$ D z5 V0 b/ T, }/ F
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
, p" a2 z, v6 W ix = 2;$ z8 j/ G3 B. D Q" l
exitg1 = false;
) U) R' y7 _/ X9 k3 T7 l. f. M( y while ((!exitg1) && (ix < 81001)) {
* p* i- A+ p% c3 n' E ixstart = ix;1 O+ {8 ^, E+ U# T" S
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 o2 v5 p. U' \# A* l- m2 o- @
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];$ Y/ G' z ^) s+ O6 F+ o
exitg1 = true; d; n/ {2 k' M, T8 Z; R
} else {
5 L( k# [# v4 ~& `, {# ~ ix++; ~# i5 u- ^- ?0 L; q8 `& S) F( h5 g
}
+ {/ Q/ \ p5 P/ H) I s; g }
3 N" u5 U) V. L+ w }
7 m/ d$ ?+ l; M0 E. x4 ` ^+ H! l. n- q% `' Y
if (ixstart < 81000) {
! b: f: X/ ` T5 P2 w5 I$ A) E7 F while (ixstart + 1 < 81001) {7 C/ A, |6 `0 ~ T" n1 F1 }8 b/ s' B
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
7 Q0 \( b5 D: m1 G( o' [ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];) P' S0 w. L) i+ g6 l
}& C5 r2 h5 \9 g+ e6 K; X x6 M
+ e# y2 A( h* r1 k ixstart++;
. |0 R n6 [) B1 C' b }; H$ R. a, b: q' x. Q; `4 f0 C2 d
}
- c; `0 W* W, E1 L" p# R/ ?0 D& f& F, x; A
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);; {3 N, x; K4 F9 J2 ?7 M
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
# M5 t* E+ A+ y9 q* B yiDuanShuJu_mean = mtmp;
( L) n1 A# N& Y6 p% j* P }1 d2 G$ z! ^8 e& o8 l
# ^" v+ e- D6 H5 @; y9 _- B
/* 找出极值 */
7 e0 Y, ^0 b* k- Y& K3 _0 d4 A for (ixstart = 0; ixstart < 81000; ixstart++) {9 |& F& b) ~; v" L, h
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;4 W* [* H1 p5 v5 {+ O# n& j8 }
}9 L$ k$ O# W" @4 A6 s% x# z2 w' Q8 R
* l |' o& l4 h# P' b3 R
--------------帖子字数限制------------------
5 j/ b, T1 }) I}# r' L7 B/ m0 K5 q! |
6 J' u8 s A% t( g
7 o% A) C2 _- x7 | |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|