|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 , B6 @4 z! u% V( p& ^) ]; y
6 W* S; }' F/ ]" C各位大神:# M* T. E7 N9 C J% X+ N% W$ ]
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)8 y' x; j& s6 q4 a* W
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
; z$ z' Z* P# C
& ^0 o' E% c: z" v 8 U( ^$ p, E: `) f- _7 h2 Z
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。! V+ W' C) ~; \( ^
; K+ g" k2 ]3 G" Z' i0 R6 m u并没有其他线程& }2 n9 h+ \" k7 O2 n
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
0 z$ e2 r6 j8 V也说不定是和堆栈有关系。。。。。。$ p+ F0 o& x# n& Q/ e; B
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....0 W( c/ Y9 ~- d3 N6 \; O
, l1 f9 \3 f4 @0 X0 M
6 j3 G9 z4 X/ s. T% V/ `" v
3 p; h& f% T' V
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
4 ?5 o" o% }& ^
# E+ X u B3 @+ K' h
: F: ~: A' [1 r/ G$ b# U& K附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000]; O6 T) P& d( }- y H0 _
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。3 i$ B- }6 q5 ]% {3 w5 g! d
/ j5 E1 J( K& l; k( J7 Yboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(: ~( d; o% X& B8 v5 x
const double data1000[1000]) {
7 \: q, X) ?, Q' G# E) T
+ S# t" M/ K7 x+ ? int myfuck;
2 `! Q% c% |$ Z% h9 U1 Y double yiDuanShuJu_mean;
/ {, b* f8 G5 \5 t6 M double yiDuanShuJu_LowMean[1000];4 h$ X* w- W$ g0 x# G/ o! ]
int ixstart;( R8 C, L. Z! I6 a" J! I
double dv0[1000];' \& A% [5 H: b0 G2 `1 m
comm_AGC pAGC;
- g2 c+ E8 I1 \' Z# ^ comm_CarrierSynchronizer pFineFreqCompensator;
# N5 A' o/ L" v% r1 J2 ? dspcodegen_FIRDecimator pRxFilter;6 c* M3 H4 |$ i6 R ?, ^0 w
comm_SymbolSynchronizer pTimingRec;6 o- `1 o! [3 {
comm_PreambleDetector pPrbDet;% T/ T7 {5 J* s1 w i% H% { I
FrameSynchronizer pFrameSync;
9 N+ e( ]( L; ` }/ x QPSKDataDecoder pDataDecod;
. L5 X( c2 P4 x, T static double usable_left_filtfilt[81000];8 y, k9 I7 D& D4 u
static double youXiaoShuJu_QuZhiLiu[81000];
! o1 h$ [7 O& ]' f3 E double mtmp;4 @" d2 v; }: R" f/ H" [8 E9 }" r
int ix;1 w$ e" c7 [% }9 J8 q8 ~9 N
boolean_T exitg2;
! ]0 F2 L* ]. ]8 w+ }3 y/ m- r boolean_T exitg1;/ p. P \. A2 ~. N F$ _5 _
double YiZhenShuJu[800];- I& o& a7 ?8 \9 m" O
double dv1[800];; g: A/ a+ I/ S2 [1 s- N4 J
) Q, X# E/ w8 {$ `2 j* H" }
0 `7 ~' ?" y) z% u4 {6 S double b_YiZhenShuJu[800];
( X, B3 }- N0 K& j1 e double I_filtfilt[800];
( d% s7 a; W. I6 O double Q_filtfilt[800];8 q& p1 D8 L* u6 ^$ p
creal_T b_I_filtfilt[800];
1 [- s8 s, K/ W creal_T b[800];
6 ^! Q" f2 ], _) P creal_T RCRxSignal[50];% I/ U. w9 }; J
creal_T fineCompSignal[50];" @! F6 x$ w; F% [
double phError[50];; l( s" h- a. [5 } U: E
creal_T timingRecSignal_data[28];
0 }# D J. E0 E0 O, \$ d int timingRecSignal_size[1];
5 v* o, k+ T" h4 \6 Y double prbIdx_data[28];
! [2 z! T/ C" w3 Q C int prbIdx_size[1];
# O5 H. U5 g, m1 z) o double dtMt_data[28];
5 Y6 z& J# R* t8 a4 }, I int dtMt_size[1];
4 @: Z8 w1 B0 y- }5 P% Y9 A9 V creal_T symFrame[25];
9 _8 u) O/ z) O9 L7 ^ boolean_T isFrameValid;& s& a1 S9 g; _. E# \6 K
double unusedU0[3];5 b- {/ I3 S {& F# B& G
$ e3 m9 e" p( n8 }" }! Z1 P
//调试过程中的变量- I# H( W1 Y1 y. `
int enough_data;
j7 B, H! c( K m/ J2 N" s+ W( B# F7 C* q( V& c
int enoughDataFlag;& f; K1 _1 h( R% W$ q; y
int yiDuanShuJu_mean_int;' W0 _2 j D( ?: p
int int_sum_dv0;
* n& W" k! w# h( q* m1 _ int oo;
! V/ ?3 F) m6 ~, g! ^1 ~2 R1 T int ii;
0 d! b$ w6 U" {, X; o7 h @ myfuck=10;
9 U! C9 t3 O) ?* f2 D /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
. H. o+ @6 k/ N& ]' I7 X% Q /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */! q( F9 N4 k5 K
; d; r& @+ K3 y# p; c1 w- I" x8 o- ?6 R
yiDuanShuJu_mean = mean(data1000);/ V2 D5 J# d8 B' W9 K }
" _# Z* r. L( Y7 I( h$ I5 d% y% e
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
# C% k* m- T2 F! y UARTPutc('A');
: S- H5 s6 Q) z) h* i UARTPutNum(yiDuanShuJu_mean_int);
7 ` ?4 k% v! e" i: z+ t! G0 I UARTPutc('\r');
8 R$ k. S; H& ]- p+ v0 z: d UARTPutc('\n');% V! ]" {" j9 q5 o! W$ p6 t. B6 ~0 K
, u3 z; \# I) T+ I( y9 o8 V* r for (ixstart = 0; ixstart < 1000; ixstart++) {1 G4 w+ \; ^3 Z4 e
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;$ f! z4 C- P4 Z4 |
}7 z' k. M, x- k( Z
1 j. o3 v: Z9 s5 U8 b
power(yiDuanShuJu_LowMean, dv0);
- G+ p2 w6 W5 z% h
: k0 g- a$ T# T, i int_sum_dv0 = (int) sum(dv0);0 Q) X, l j% I+ ^% W0 G4 x
- Z5 a7 ?7 N' p) V9 L" g! m. W* P UARTPutc('B');0 r, o/ C& B" C) g' i' m* D2 o
UARTPutNum(int_sum_dv0);1 E3 i8 e' I% U; V9 \6 Y$ U, n
UARTPutc('\r');
% W0 y6 ?5 J& M2 ?. t+ S UARTPutc('\n');& F# q9 G! x- b4 r. H
; C" h( D4 J9 }/ a$ L) O# J1 a2 J2 H
// int compareFlag = int_sum_dv0 > 1.0E+8;
, |' y; |$ |2 I$ F# D/ M0 e2 d& m! j+ k9 r" } J, P _* d6 B3 j! f* S
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
! E6 [6 f! [; ]! M UARTPutc('C');! C' f: e" b( v( \5 q8 H9 p
/* 比较信号能量 */! K# B6 U- d. V% B' K
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
$ s; g; _1 Y3 g% y& I4 T m& B" X// yiDuanShuJu_mean = 1000.0 * youxiao_k;
) O4 w5 Z0 J! h8 w// for (ixstart = 0; ixstart < 1000; ixstart++) {
4 _/ w3 [1 h w: g7 k# [8 P: U// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
1 x6 C+ f$ Y5 r; q' s// yiDuanShuJu_LowMean[ixstart];
* P7 \2 }9 U& l6 n// }0 {9 \! H+ I1 ~5 e% y
//
6 j# u# P" w* m$ z/ d1 |// youxiao_k++;
, {+ Y7 n3 g5 C5 Y2 ?. @- T// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==4 {' X1 g, y0 v# ]
// /* 感觉要取21个数,即0-20, */* q4 V7 j* w5 ^9 I# {
// enough_data = 10;//有效是10,无效是0( f5 `% v; A7 Y
// }/ X! W9 _) q5 j, |5 L: v+ `* _
}. r t9 \3 o" N2 w$ h: W
2 w2 x7 Q7 I0 K3 t
( u6 j% K0 ?$ M+ Q4 i, O enoughDataFlag = 100;
, L' E3 G1 t& c: ~ enoughDataFlag = 1000;1 ^- b! Y. B- w ]4 A9 E
enoughDataFlag = 0x02;' i' I4 m* c" |
enoughDataFlag = 200;' ~( j. ^/ Q3 q7 Q
! g( B2 W7 |/ E% k/ h
int myfuvk1;
- W: s- _; m2 w$ X myfuvk1 =11;
% M! A/ w" h/ i* g* {# w+ } v% I9 [5 |- n4 l- ], X$ }
7 x! A% w8 K. P$ U( x( R8 b5 [ enough_data = 0;9 Z/ r0 d# l9 S6 F) S
* W5 J5 B4 J8 p1 J1 v// if(enough_data>50){
7 `0 n8 t) }) l& A// enoughDataFlag=0x01;
6 V Z" U U* Q& q// }else if(enough_data<50){, ~) y# ^$ n3 ]0 E
// enoughDataFlag=0x00;//0x00还是不行) U& o) n7 E$ e2 G. ] W% m
// }" s1 |7 @0 v7 _! J
) c U( {5 a5 \2 i' [: S. [& f; J. f; L2 v ^4 }
oo=10;# x" ?* V- i% L. q& i5 M
oo = oo < 5;
8 t" z# M W. n) a% \6 F; N if(oo){
, p' k6 ?) X3 a0 G% A W ii=0;" K T$ M' x* S6 Z& G: k) L
}4 ?/ L5 c' u7 _' ~, y, x9 I1 E
if(oo < 5){# b1 n$ h" [5 ~, n
ii=0;
$ r% ]' i9 |8 e }! N$ E( ] y8 Z$ U
if(oo > 5){
0 J+ W! H) R! T8 J1 w ii=0;: X5 z9 R3 d7 ^
}
5 c$ g9 q- R& v
f- G7 m3 l* H. \ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
# I+ s2 ~5 @2 B3 r7 L8 U /* 如果数据足够才执行主程序 */- e% [+ y, _6 H7 q5 |$ o, E3 Q
oo = oo < 5;
7 Y/ `; ]8 b# W+ Q; J: Y+ K) c enoughDataFlag = enoughDataFlag < 5; G/ R0 O8 A9 N) Q+ I$ Q
if (enoughDataFlag < 5) {
0 U* l8 }9 N& S! r" y// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
2 N% M% @: S6 Q) \ AGC_AGC(&pAGC);
& F4 n2 ~6 Y6 ^* J) l' ^2 H4 W/ t1 e+ z
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);0 N) f% `6 ^" O% }9 B0 r
FIRDecimator_FIRDecimator(&pRxFilter);* }& o J' o6 q
* z0 y' t8 }& d4 m
/* Downsampling */9 F G5 R* L8 N9 {
c_SymbolSynchronizer_SymbolSync(&pTimingRec);3 a: T- F: h r5 M' V* E
9 a* e0 p" n* D4 d/ C8 o3 G9 s: H
c_PreambleDetector_PreambleDete(&pPrbDet);/ H1 s* w8 t. j4 Y, V( t
" g. ?8 Y g9 o
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
1 L0 R9 d# p3 m* j. |1 u /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
# Y4 u6 ~$ M- p- V% [ /* %帧数量=100 */
4 Z1 ]! k, U0 r pFrameSync.isInitialized = 0;0 ]2 C) J% n6 i, F
7 }; S8 Q6 z! ?3 L" C7 Z* Y /* [EOF] */+ o, K6 ^, K u: l+ I) Z2 R
/* 前导码长度是13 */% M d7 s3 k. F8 g" R! `' A
/* %qpsk */" P2 d6 P k1 N: k/ z
pDataDecod.isInitialized = 0;
/ k6 Q* q S# h4 y0 U
5 w% S7 i+ o& W7 w* B /* end */
- O" d b" z) d, k5 W /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
1 y' ]3 j0 y* g4 l! [/ ? /* Convert 3-dB frequency */9 j3 {" Z& C7 G7 H* B5 |- |/ \$ C- `
/* Convert 3-dB frequency */
( l9 _6 K: N$ @7 T- |: A5 b filtfilt(save_buffer, usable_left_filtfilt);
$ B" ]! N# x/ |0 p' N for (ixstart = 0; ixstart < 81000; ixstart++) {) u4 g# w# _- ~$ M4 x& t6 C
usable_left_filtfilt[ixstart] *= 2.0;
5 @6 j" ]5 |) ~2 Q1 x }$ b- e7 g0 Z3 I A. |
2 I* f/ H/ k1 Y' J$ p
/* 注意乘2,处理幅度 */
- E8 i) V& w5 `( A k9 ? /* %% 我发现带通之后其实就均值为0了,不用这一步了 */$ V8 j, ~% v1 f, }- S# X; p) ~$ q
/* %% 行列转换 */
9 B, V) m6 o( V+ o& c. g: C yiDuanShuJu_mean = b_mean(usable_left_filtfilt);, o0 {' D4 R5 W9 h7 I5 e
for (ixstart = 0; ixstart < 81000; ixstart++) {4 w+ B& u- O: @# r u
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]1 X7 y, o' ^/ _$ M- t% q& t
- yiDuanShuJu_mean;* h0 V$ K- b0 |* s$ u
}
8 y1 @. t: f; }# A: _! Y' T# C, I% R7 C8 @+ y% z2 S
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
; e: ~* h% r" f6 a% a) S$ b# N! L ixstart = 1;
0 k' f+ Z& X4 Q5 \( D8 ^ mtmp = youXiaoShuJu_QuZhiLiu[0];
& v, I* [3 t# ] if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {& P: B$ l; l. S, K- Q* Y& Y7 L
ix = 2;
: ^3 @! {5 N0 e2 P exitg2 = false;
( Q& R8 u( _0 y- x; Y2 P+ h8 o* C5 Y while ((!exitg2) && (ix < 81001)) {
; R% M! L- f1 j% p+ H) J2 x7 }, l; N% D ixstart = ix;; p* V( J& P& @
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {3 }8 w* ?( ?- t0 I# {' L( ]2 F j% P
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
! [: T! K2 y( ~1 i( ? exitg2 = true;/ L2 `$ o4 d" q. M8 M( k$ x
} else {
4 |% S+ u" ?7 A/ T8 N$ B ix++;
) B' [5 |8 w: ~( s3 a: \ }5 |! N u4 a- [. Z" J
}* {( R; N, L% F1 Q( o
}2 U. Q" L: G, }- ?# P: E& q
' D/ e/ S- A: T9 W: ~
if (ixstart < 81000) {! B4 C( `# ` N/ I8 O& ~' n
while (ixstart + 1 < 81001) {
z6 _5 U8 x' e if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
5 B$ Q5 N. R% Q- J' b5 Y mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
$ ]6 o5 z1 b) g7 C, [0 e }
1 x# F- q/ s9 t: r6 n* }
! K3 T& X, s* g' E6 B ixstart++;
0 [& N5 b. m- t8 ^7 W4 A }2 P. v- P6 u( o; J
}
$ B7 z, v0 }- D T7 E" i+ r
( ~1 h5 R- I9 m( n) q. ]" ?( B8 L ixstart = 1;
! I4 I# I) l- s yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];( a2 ^; K( B9 @8 f' [- V0 N
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
/ @3 C/ n4 Z; M* T9 u, U' b- P ix = 2;
9 \, W4 r# T, ]7 I7 M+ B+ a exitg1 = false;
, O9 [; y! W; }8 m' z while ((!exitg1) && (ix < 81001)) {: L5 N2 x" n7 n' e) q% v# N w
ixstart = ix;
4 F$ M0 A' O7 P7 z6 Y( N- N R ~ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
& _( _, |& p# p9 ?" f/ J yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];. L* T7 A+ g' W4 h" y8 R# H
exitg1 = true;7 v- Y- l& H# p: ~* G8 _9 m
} else {
3 R' h3 t+ i8 I/ ?9 l' S$ | ix++;
2 _. f7 u: U0 | }5 H1 _4 {2 Y) T% v Z/ F: B5 J& W
}. i& Y6 S# t! h( z5 B2 m
}
- l3 L& v& [# O6 ~3 Q+ F. \
# b! n9 d$ I6 p, `" r- ` if (ixstart < 81000) {
/ w% ~5 b1 D+ ^1 {8 o0 n while (ixstart + 1 < 81001) {$ s- x3 L( O4 m9 p/ p1 _/ c, N A
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {, |9 h& y0 e, ~4 u
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];; n* u2 N$ J9 U/ a# x) U* t
}
$ |8 g2 W8 g( J8 ]' L
$ Q2 {) R7 e5 P; R3 b ixstart++;9 v$ o. c. z* R" C6 G
}
' f; u* \# u: g. F }/ N& K# u4 h& e$ x, t" z# T
$ e' R3 B9 o Y4 l1 ]0 w
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
7 D, _7 D. {) | if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
4 g- H0 W$ f& t# z4 X8 i% `$ ~; o yiDuanShuJu_mean = mtmp;2 z2 l8 C3 P1 }4 `
}; P2 r" X: |- K& g" S' Y+ O$ t" K
* k) n8 K5 ]6 r* ~1 } /* 找出极值 */
* c B+ B' s+ D5 [$ y for (ixstart = 0; ixstart < 81000; ixstart++) {
# @' k- a+ T( U6 E$ E6 D& C youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
8 H+ I% N @6 l& X+ n0 G* I }" T7 ^3 p W D. \! H: G5 f2 z# T
/ |: h! _' ~6 W% Y. a
--------------帖子字数限制------------------" q/ r1 T: n) ^) B3 e
}
S" o! {- o7 y( c# }* S" Y9 d* I; A3 v: T* L+ a Y2 A
$ c- {! q5 S. y5 A* B! m
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|