|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 # L8 c$ x) T" w+ Z7 ~5 o! ]+ m& I
- K W2 B# R* `* w% ?各位大神:
8 `; I0 a; O9 S+ l5 W 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)7 B) P: {& \/ S# }. u
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
5 v9 b& s& K% y" B+ F# z* O' F& A. e( W$ W
2 I$ J+ b8 \. k0 z' ^) }" p
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。9 O+ E/ q7 h& [6 N% J
7 Y" F" ~8 B N# g3 p8 @并没有其他线程
7 M9 V) F8 D! U5 o. V( {5 c, ?" E反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
4 f' Q5 y" S c4 |* a6 i/ p8 X也说不定是和堆栈有关系。。。。。。
. } e5 B! ^# P' k1 y4 [% w' W请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
4 j0 A3 ?, [. r1 A8 j% u
2 H$ I1 Y5 {8 {/ @: r8 ?6 P9 a6 U- g* X7 A8 ~- t1 L7 R
% D: i8 M# G3 E5 v
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
' Z3 _1 k4 [: D1 j$ n; g! s4 t% K
& N+ e7 U! i" F- a! e k- P6 E3 `0 [( f L# q
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
# y7 p2 v, b, M static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。) m* O& E1 I& j; z$ C
; _ t* ~* m8 p: B* E. L% L
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(2 @; p. J5 ^2 \* [' x% j0 t6 W& V
const double data1000[1000]) {5 H2 j. f3 a7 B- i7 U
: ~" {9 L3 ~9 N3 _ int myfuck;
1 A1 }5 ~$ n2 }7 n9 s: D: E' U double yiDuanShuJu_mean;
" K- }* M0 O( n& E. t0 t2 C( g double yiDuanShuJu_LowMean[1000];
- j( a. {' R: }5 {/ \8 n) p5 F int ixstart;+ Y- \2 n: H/ `
double dv0[1000];
# h# W; J$ c+ S2 l; A9 ]! v2 d: |# ` comm_AGC pAGC;
; `) B. ]4 Z" O i. g" u comm_CarrierSynchronizer pFineFreqCompensator;
2 v% h0 u. n9 Q. y, ^ {4 ^6 w dspcodegen_FIRDecimator pRxFilter;0 D; g! ^* M" X% W8 I. W4 f, Y1 N
comm_SymbolSynchronizer pTimingRec;) U( c4 Q. G4 m: y3 s
comm_PreambleDetector pPrbDet;" J2 Z5 }6 B, \7 G( `' a% d
FrameSynchronizer pFrameSync;, a" g, |" e0 G* a, H! d
QPSKDataDecoder pDataDecod;
, f/ n/ y9 E1 Z* d/ ?( D7 x/ h static double usable_left_filtfilt[81000];6 x5 |' |! w" ]% u
static double youXiaoShuJu_QuZhiLiu[81000];
! ^ ~5 i8 U" e3 u0 Z# n+ x double mtmp;
; {# K1 F: L/ }* W int ix;
, \* z8 T2 A4 Y2 T) B7 F boolean_T exitg2;- x/ |5 m" Z; s
boolean_T exitg1; G0 j* r/ p8 K! Q2 v. U
double YiZhenShuJu[800];. s% U7 A! |& R' o+ D) a; a
double dv1[800];
% [5 T n7 u7 t& m: q: R; M4 Z- \* J( p" H& n0 Y
( n Q* W u9 p* B
double b_YiZhenShuJu[800];' d" O& _: O4 w6 T) Q( d2 U- O- _
double I_filtfilt[800];* @& \$ u3 |, s4 d9 b: h
double Q_filtfilt[800];
7 e' ~$ j& g6 \$ t, q5 o f creal_T b_I_filtfilt[800];
3 `- @* I( u1 j' m5 ?* `. k creal_T b[800];' k1 d% T" ]" I3 V; i+ D
creal_T RCRxSignal[50];& K: L, K: j% n
creal_T fineCompSignal[50];
! V Z' e7 n. Y( Q3 t) y9 g! a/ n" m5 | double phError[50];
7 O0 @5 e% H6 U creal_T timingRecSignal_data[28];
0 `) b1 w K U5 f int timingRecSignal_size[1];
9 D" w: i. w" I& i/ D; t double prbIdx_data[28];
: z: H- \: A- B int prbIdx_size[1];
8 |3 X+ ~* k2 ^; N# @6 T0 ~ double dtMt_data[28];" t& u) O& l" t! n; W
int dtMt_size[1];* n0 g+ _3 B# j+ O
creal_T symFrame[25];# {- c% O: a% u" N/ f
boolean_T isFrameValid;
, g% |6 l5 M7 R/ u, J2 \ double unusedU0[3];
" U" F2 Z. m- @' W# U. }& ^( B; ^. ~& U
6 C+ Q# g6 N( [5 {8 @* S/ i //调试过程中的变量8 N! `7 ^7 f7 r$ ]$ _2 N
int enough_data;9 K; [: M# e# X- v3 c/ h @& k+ m
! @" {4 h, l. z q int enoughDataFlag;
& r4 T: l" g0 }/ Q1 u* Y0 G# R int yiDuanShuJu_mean_int;
1 Z# B! E4 j! g, B B int int_sum_dv0;% E3 ~+ X4 h; @. V A. d; K5 i
int oo;% `, ?+ k6 c5 {1 @2 T/ x
int ii;
1 Z \" ~+ E' @7 U myfuck=10;( y% V0 b1 d/ ]# M
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
. o8 [0 b5 b, t# A /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */) U/ F4 I5 P- ~6 ?
) p6 s# c. h4 g( O yiDuanShuJu_mean = mean(data1000);
. Q- G0 v$ C8 y, L
8 U ]6 C6 Z0 k! x6 t$ d8 g5 ^ yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
7 j, u. t" W+ Z N2 Y UARTPutc('A');7 A9 k- E8 m( j3 c9 Q8 U$ p* q
UARTPutNum(yiDuanShuJu_mean_int);
; L; F: p" C) Z2 a$ j, N* _, P UARTPutc('\r');1 {6 R0 G: W. G' W! R9 `& g$ k' j
UARTPutc('\n');' b: e! {4 M& `. W- \& y
( M3 t: z, }0 X" p! `
for (ixstart = 0; ixstart < 1000; ixstart++) {
3 a2 H# d5 r0 ` yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;/ n, H8 S0 l3 J" e- I
}
: \) M- s. \' L3 M* A
/ f: U X# G' o4 Y+ I power(yiDuanShuJu_LowMean, dv0);
, J8 ^# H7 D: e W6 g- D! a/ p' q. B- a( k3 ~6 D) }3 S6 f* }
int_sum_dv0 = (int) sum(dv0);
/ z# R! Y: m9 X0 x- h
|( ^' @# [3 g! V$ B& J UARTPutc('B');* @) k; y7 g6 @' x. |7 E
UARTPutNum(int_sum_dv0);
5 N2 y+ d5 ?1 }3 ]' f% `, L0 {) z UARTPutc('\r');
! S! ^4 |- j( K" Y) _ UARTPutc('\n');
4 f5 \. }/ i* ]( n. G$ Y0 ^+ t* F! j1 X( F7 t4 G
// int compareFlag = int_sum_dv0 > 1.0E+8;
( X+ l" P8 R- P5 u4 J5 d3 p b9 ^4 a, W+ J5 m" C/ G
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
: x2 _3 P a1 J- T7 u UARTPutc('C');
% @- F8 `7 L n /* 比较信号能量 */2 B6 G! J5 C" C# N% w' ^; |7 Q
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
- ?, i3 y1 m3 I3 H6 ` }* Z// yiDuanShuJu_mean = 1000.0 * youxiao_k;& G7 e+ v/ ~' C9 }
// for (ixstart = 0; ixstart < 1000; ixstart++) {
1 v/ o3 J& Z i; u+ U4 x8 Y l// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =2 W/ u9 k9 E4 ^6 ~5 C
// yiDuanShuJu_LowMean[ixstart];4 Y- c# l# _" D/ M5 [2 L L1 N
// }. [& l' {2 g9 V4 y/ N6 f$ [# {
//
1 k. e8 v- h/ c) w( F& R// youxiao_k++;
\& ?# p7 m! v6 ]2 M* ~ q// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
+ k- m' _" p7 S8 ~6 ]$ ^# @5 O// /* 感觉要取21个数,即0-20, */
1 I8 i6 M$ h$ }4 F1 d// enough_data = 10;//有效是10,无效是0, T! A, f. Q2 ^+ P( g/ h4 C
// }8 I% d: d7 |% C% T
}
; |0 ^% M) S2 Y( J
' h0 L+ @8 v' y- i0 j0 W
1 a4 _, M1 P$ Q. z enoughDataFlag = 100;( d# L2 c0 j- D
enoughDataFlag = 1000;
; g6 i' }$ }: i) U7 h* c# O$ q) Q e enoughDataFlag = 0x02;
# b, j6 {1 U/ @0 T, | enoughDataFlag = 200;
) K$ N( \5 u6 D% K! c1 p, N) }0 O
int myfuvk1;
! {/ d5 T" V9 s/ q' Q; H0 H% l myfuvk1 =11;
& X% u5 c! I% h! P- e; d8 v
x/ s: o( \9 L0 @3 W% N; A0 ?& l$ X# v b- b! {' v5 e( F
enough_data = 0;0 n- v( S$ y( c' d8 F# A
/ z8 N4 ^2 B& x7 [0 V// if(enough_data>50){
- O1 m3 a7 J+ L/ `9 q; T! p// enoughDataFlag=0x01; a% R8 i$ N% A. z+ L- F( e2 H
// }else if(enough_data<50){) q, {! K m1 k! R/ T
// enoughDataFlag=0x00;//0x00还是不行
" l1 z, E- \, @. s3 b// }; B, ]2 T; p8 S. P
. Z+ v* p# K$ ]1 K& U$ K/ w; f2 {* U5 A2 M
oo=10;
' S0 Y1 k. o: l, x( w3 ]# u oo = oo < 5;
, W& }7 j6 h/ Y% P# s" F if(oo){
% d7 w6 K$ U$ y6 @5 _/ I0 q ii=0;8 [; J6 c+ A# C- c2 t# a- Z- o
}5 |; s+ U0 m" A! o: l8 F
if(oo < 5){
5 h- x1 g7 @5 M4 K" i6 o" U ii=0;
3 w) ?) b8 u6 t4 U: J }
: \+ H1 F6 X% M6 K( [ _ if(oo > 5){8 G8 O e; C3 R D
ii=0;
! j% c9 e1 x$ F8 g7 C) Z }& e! h1 M: W3 X8 o; A. k, E
0 I& w3 h6 S) i4 D: h, [. C
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
# {% |5 \& b4 w) U# F /* 如果数据足够才执行主程序 */
' W0 ~% k1 \9 \! ?9 ]( ?- G oo = oo < 5;
6 W3 G h9 K. E% `# _) H! ] enoughDataFlag = enoughDataFlag < 5;
7 w L: l7 ?" b7 A2 {* j if (enoughDataFlag < 5) {4 K, y: ]3 \0 P4 m: o
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0$ I4 z- Z& O+ `. h0 }" u
AGC_AGC(&pAGC);
! k& ?* Z G: T3 Z, @2 b( b) n) U+ l, `
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
" w* t0 C/ z/ ?5 f) M; L FIRDecimator_FIRDecimator(&pRxFilter);: y: u" O Z/ X2 Z3 Y
& ^, ]6 a Y# A- Y) c
/* Downsampling */: x# z. i+ u$ {: G( z5 o) z; \
c_SymbolSynchronizer_SymbolSync(&pTimingRec);2 H7 K9 m. { p( v% t3 }! v
3 l2 g" r' p) i) d7 T3 C
c_PreambleDetector_PreambleDete(&pPrbDet);: J1 H8 l {5 _' Q
, t( t6 }$ e. m; J
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */6 s1 a1 f- l- z: h3 z# d
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
5 R* Z; y! k9 c /* %帧数量=100 */
5 U ]3 ~' C- S, { pFrameSync.isInitialized = 0;: \5 J4 a$ W# i* j9 ]% Y
/ X0 q6 E4 P$ s ]
/* [EOF] */
: U& R$ x7 ?1 t# e& [ /* 前导码长度是13 */
7 y0 Q2 a) e% d3 a: R /* %qpsk */- ^7 P. Y, K0 n; u6 K1 P/ k
pDataDecod.isInitialized = 0;3 Y9 s% [; A- a5 E
2 \. j3 K! A% {! w
/* end */
: U$ F6 w2 E' Z /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
* x+ K- @# E, s( ]4 d* C# A /* Convert 3-dB frequency */
) t5 g0 Z' y+ x" O; q8 ~ /* Convert 3-dB frequency */
+ M# x- \: W$ i6 e filtfilt(save_buffer, usable_left_filtfilt); r8 {3 ]" K, K/ W4 a& i: c6 b
for (ixstart = 0; ixstart < 81000; ixstart++) {6 R1 z% S, q; m" U8 R
usable_left_filtfilt[ixstart] *= 2.0;/ P( j) b" j" n# g
}
" I' v: p) J9 @6 z
1 Q1 s. N+ H7 q. d2 v$ Z3 O /* 注意乘2,处理幅度 */3 e8 Y" O# n5 k L2 M
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
7 r& {+ T F8 H) m' _5 u" l/ _# } /* %% 行列转换 */
8 {( @* V. {6 |6 }: U0 }3 D yiDuanShuJu_mean = b_mean(usable_left_filtfilt);$ I' V0 l; y% g
for (ixstart = 0; ixstart < 81000; ixstart++) {: n: d$ ^+ ~7 e. P% q5 t8 Q# L
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
2 V" ?. Q$ X: l" n. G5 U5 C - yiDuanShuJu_mean;
z+ N; y5 S8 }7 S1 S: I1 {) U, M }; {8 Y n5 E6 e( d, h
7 M+ G5 t4 ?7 N5 s# [ /* %% 应该对数据归一化,但是这一步放在哪比较好 */
# a% X5 T/ P5 v" `: F$ w3 y ixstart = 1;+ `7 X2 H- ^+ ?( I: v: \
mtmp = youXiaoShuJu_QuZhiLiu[0];
. W6 z) F0 d9 z3 `9 q7 O if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {: N; C7 b* y( f' X4 Q
ix = 2;
/ R& I. `4 y: J1 B/ o exitg2 = false;
; I% n; h4 d' b( l; B) p while ((!exitg2) && (ix < 81001)) {7 t& l7 ~. I9 ]. }+ P1 |
ixstart = ix;# a( M8 g0 ?! T$ E! e
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {. P: f9 e% b; l
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];6 P: X9 k7 h! W- j7 ]6 l# H
exitg2 = true;
( M; G6 A6 Z1 v. \. a" V3 i% q } else {
0 A* F1 J7 b- u: W2 v( d% S. ^ ix++;, Y; k% `" B8 u% s6 f' d9 ^# M
}
) o& @; K% X) `5 i* o }
[$ r* ?& X4 H' W9 ? [5 q }
' u7 |0 E' V h. X( ]6 l) L; z3 Q" D2 J- U6 b8 U& ^! s( x: Y
if (ixstart < 81000) {
8 q7 b F, F9 i/ o* A% Z6 B) w while (ixstart + 1 < 81001) {! D$ t* c+ o* s+ Y& K/ U
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {! S- B! S0 k# g; T0 \: {
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
7 f8 ]) B" M4 p3 ~0 l' J" \; a }
+ n3 }8 m' s* F2 u V) Z- r
7 A; j4 c. Q& n0 x7 ` ixstart++;
6 X1 U9 g0 c- i& _ }
, w/ \6 B/ D# q& \. [ }
* P; \' T- }+ d1 Y* O
# _" J' @& y W7 o1 Z ixstart = 1;; R: L. F3 E, w" \$ p
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
" g0 N4 K6 v2 O7 o7 I% C' h if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
" y$ X% }8 A( p& w1 v ix = 2;/ |' R4 ^1 `7 y, Y" r
exitg1 = false;
$ V' _& P! h4 B! R* u while ((!exitg1) && (ix < 81001)) {
% }. ~3 i1 f M4 r O. K# A$ W1 C ixstart = ix;/ E3 o( ~; _6 Q; w
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 T. V9 W3 S7 b) @
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];+ {7 [5 X5 j# j, a; y
exitg1 = true;, d' u# @4 m/ [3 J) D1 g! g. n
} else {, x1 g( W' V! S& i
ix++;& P7 z3 U9 \! W6 C1 e% l
}
- i. Q+ Z/ x( F/ c1 x, u }! B, B4 G Q) p$ N- P: l( {
}
+ ?: r- L7 z5 ~6 R: V! x! e# i( A9 v! Y+ ^
if (ixstart < 81000) {/ ]( @( p$ n: y0 v1 W0 `
while (ixstart + 1 < 81001) {$ ~0 S8 p5 h: ]' Q
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {$ T: i" |( t$ A; k8 ~4 |6 t" w+ q: v4 t& g
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
% Q# T& V7 T- M6 E4 v }
) k, p% c+ E7 ^6 }& O
. E9 N' j0 e0 s2 s, U, Y0 _ ixstart++;: ^& H$ S$ \3 ^. }. R" z8 Q
}- N, m6 H0 X" { x! H
}
2 [8 i8 a2 M, x3 e$ o
) s6 F9 b+ U w" Z yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
8 F* h+ n/ w2 c9 n: N if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
$ {4 [* B+ v9 F" T6 i0 i yiDuanShuJu_mean = mtmp;1 u) r, [9 t* p5 q; D' v" k
}1 g* O% z& n% H% v. y( Z
+ E1 k6 H2 _% O$ N) U /* 找出极值 */
" z( l2 o5 c! r' a6 m, ?6 @- x for (ixstart = 0; ixstart < 81000; ixstart++) {
5 m. }8 D: J, W+ _, F& h8 B1 T$ i' M youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
" Y8 ]5 L! x: X* g }
* O l# ]0 u7 R, F7 A9 o: I) _# t" c5 i7 A& d
--------------帖子字数限制------------------5 K+ R/ }# I2 p; r
}1 `& s- M' ?7 F
0 `9 N4 t* P4 B% T( m% {/ k3 l- W$ F3 `. f( g
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|