|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
5 V5 I: B" s. a
E0 y# ?1 T2 c+ [; P各位大神:7 q: i" ~+ R5 N6 a8 z6 D
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)( s9 N. ^2 r; z( H9 q1 q1 D
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
6 w% W& s3 j/ J: F
, C. M% q& q8 `
5 o* T4 s( @# T& s# V% V7 S+ K7 u这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
! q' ]! w' S! |1 @. Q3 W; l) r/ I) C
并没有其他线程0 v8 @; J, E X2 n$ X% j
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
' l% D4 {( a* S. v也说不定是和堆栈有关系。。。。。。
- A; P( b5 E6 u2 e$ Y请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....' }+ f& E+ R; D$ S1 x1 n: h/ t' F
9 l/ k* Z D. T0 n' q4 Z$ n% e- w4 s9 _" u/ o
# P& N" B; d2 y" I" E
我也很绝望啊,希望大神能帮帮忙,感激不尽,!7 e K' q- F( C5 e! E
3 P" \, {& ^$ M7 O& L; C
! b. H) f' G4 g' v, K
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
9 w0 Z& ] |+ B9 y static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。7 G/ O8 S' ^* u) S0 y6 ^
/ W; Z6 K D8 _% K! l2 iboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
0 \2 a% j: g$ J, U* j const double data1000[1000]) {
, F1 I" r! v0 h3 i4 \* z3 I/ p. b9 I. Q0 c' K
int myfuck;
' H1 R4 W' H0 }& G4 {( b3 A! I4 d S double yiDuanShuJu_mean;: G0 j6 t7 H- Z- a5 U' ?( a) S4 H( k1 ~8 @
double yiDuanShuJu_LowMean[1000];- j1 s; m5 u+ l# b/ I3 {, I
int ixstart;
9 x c3 ] X" [# y, ]+ B/ G double dv0[1000];
/ m4 M6 d4 \9 G- h. M" P R U) h comm_AGC pAGC;1 \7 X( Y2 K Z' N9 O F) K
comm_CarrierSynchronizer pFineFreqCompensator;% v' n# a" @* h% Q- `; ~
dspcodegen_FIRDecimator pRxFilter;9 Q: W& {% h- C; A \& G) H3 @: e
comm_SymbolSynchronizer pTimingRec;6 M( K% f2 a* p+ U8 b% Y
comm_PreambleDetector pPrbDet;
& H5 y9 v& |; C3 p% L FrameSynchronizer pFrameSync;
$ c7 ^) n \9 T" O( | QPSKDataDecoder pDataDecod;, `2 g4 c) E; N' o
static double usable_left_filtfilt[81000];7 `/ @( {7 p" R' G H
static double youXiaoShuJu_QuZhiLiu[81000];
& r1 E5 G) b$ G. U double mtmp;% [! ]- V& L. Z
int ix;
0 L8 @0 d* q' f boolean_T exitg2;
( T; T. Z5 U) T u$ A7 u0 T boolean_T exitg1;7 w& A2 d* @7 _( I3 \. M u
double YiZhenShuJu[800];) l- H, v* D) k! Z8 p
double dv1[800];! ~2 e* i$ ?5 K) X- {; @, {* ]
. N/ d5 \+ R& c: {+ b, l3 I
}4 g- C7 R4 u. O' t- N9 @- \ double b_YiZhenShuJu[800];# s( A1 p, z4 d9 W) P- ~* q
double I_filtfilt[800];
x5 k) @9 A* Z0 z1 }2 `% O! c double Q_filtfilt[800];% w8 F+ y0 [3 s
creal_T b_I_filtfilt[800]; R' m) ^/ P% a
creal_T b[800];6 z6 b+ Z4 Q& v; k
creal_T RCRxSignal[50];
6 W9 Y8 `, o' }% Q v creal_T fineCompSignal[50];3 E) J3 e% f8 a1 b! ?# m0 r
double phError[50];
7 _9 ]4 O$ C6 m d6 K creal_T timingRecSignal_data[28];
3 K/ ^8 a* O* x" I, {# { int timingRecSignal_size[1];+ P6 m6 r! J5 E( y' v* D* y/ y
double prbIdx_data[28];
[ b% y, x0 i B% ~ int prbIdx_size[1];
) ^- Y7 Q; `! {/ D, e" ~; m' t double dtMt_data[28];* Y6 `& F! z r$ o: D$ ^9 ]
int dtMt_size[1];2 _+ w8 H% N" Y5 G/ d8 s1 m# {
creal_T symFrame[25];9 R; B% ]8 X+ A* p, }; z
boolean_T isFrameValid;
# B. ]$ q, ]" T; a# `! b double unusedU0[3];/ }( q- B9 m; N3 K! t- m
4 ]6 Q- i, A' ]" T5 V( F) j% R- H
//调试过程中的变量
2 _- O+ W% h- @# {- X int enough_data;3 a: o5 z0 K3 p" u! Z/ l' m
- r+ R0 h8 o8 r3 M" v* v+ T0 u( K
int enoughDataFlag;/ q: H. O' [4 y, @4 x
int yiDuanShuJu_mean_int;
& W+ _, D. y" B% A int int_sum_dv0;
* J b& S, j9 C: B& S int oo;
, f* i/ W. V- j. Y2 F/ F int ii;# x( S( ?- T. k+ P+ [1 F
myfuck=10;# k, }& P+ p, l. _% _. h
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
; Q" r% n+ m+ |, K7 k$ ? /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */& y9 `8 ^! m3 m' T8 X& `* W
h1 V# M& o7 b) I
yiDuanShuJu_mean = mean(data1000);& ~; ?' Y+ r/ f& z
; z: M' e0 [% W, H3 s( e8 \
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
6 I+ c0 \2 T$ Z UARTPutc('A');$ @8 j# b. G/ }) _2 V
UARTPutNum(yiDuanShuJu_mean_int);
8 V0 _ H# b- k% H# Z: C2 v UARTPutc('\r');0 _. @, R# u0 X6 r+ a2 r8 r# S
UARTPutc('\n');
3 F. b2 e- M& b+ o6 y2 u1 U& C/ m; \. A3 n& e4 e# |- z) c
for (ixstart = 0; ixstart < 1000; ixstart++) {
9 E& Q& G1 t0 z yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;% [7 N) l6 g. j3 c6 h
}
& w) f. T, o T, }- H5 F% h+ d( q
power(yiDuanShuJu_LowMean, dv0);) O5 z2 E, p" K
$ L$ g7 H0 A. X- ^
int_sum_dv0 = (int) sum(dv0);' e8 S- [! L9 ?' K: H' ]# y4 D$ \: h
: X/ O+ s" J, M5 p
UARTPutc('B');
7 a2 N" i% S2 _9 @2 ^+ D' s UARTPutNum(int_sum_dv0);
. @) x& B+ M( S9 x2 q. ]* k+ } UARTPutc('\r');* L' V+ `6 ?$ q) z! Z
UARTPutc('\n');( Z: S7 |$ N3 j5 B. T
' }/ |* d5 E( s- u; U+ `7 E
// int compareFlag = int_sum_dv0 > 1.0E+8;) ^. s5 U* ~' k, j3 N) B
7 e2 Q1 i. Q3 O2 r# o) g if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?8 b6 Q1 z& W+ b& A% A* o/ \# l
UARTPutc('C');2 O9 e7 Y) A8 D) w9 ^
/* 比较信号能量 */" L. u+ X' }$ M b$ N
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */, z5 t: C; V- ]! V) [7 M
// yiDuanShuJu_mean = 1000.0 * youxiao_k;! k1 t. l. x) C0 R |. t) d
// for (ixstart = 0; ixstart < 1000; ixstart++) {
& n9 ]" u, r, y, E1 c0 m// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =5 M( n" \$ w* m. X7 S
// yiDuanShuJu_LowMean[ixstart];, {+ U! {& `6 |( M% x3 p+ Q
// }" k0 r) y* X6 Z1 [
//
~$ N! n$ S0 p- `! w+ @* e// youxiao_k++;& Y- x$ l; N8 `3 c' Y3 v. H9 P
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==1 R# j, h9 x9 q1 p2 K$ h4 l* t
// /* 感觉要取21个数,即0-20, */
1 r5 \- s% n8 G2 W' Q// enough_data = 10;//有效是10,无效是0
+ | v$ k7 b% R) t7 i9 C1 U* D. a// }
- ~: a# J" V$ t1 t }
8 T+ q7 G; a& L6 t) q( D5 E& o& q( E
: f+ n; k( p& G: q- {- \ enoughDataFlag = 100;
8 O" H3 i: p8 z$ E4 F( u/ Z8 S enoughDataFlag = 1000;
# a0 f8 w c( J enoughDataFlag = 0x02;
# @' k1 w$ [1 G" T$ { enoughDataFlag = 200;
M% `: ~ ?& O) f# M$ _
# n- j7 e" ]. t) C! d4 p7 f# j int myfuvk1;+ Y6 s" P* } v Y# a$ M% [
myfuvk1 =11;
& v8 F* s1 V9 n6 u' r) C3 ]* V) u; @7 v# [* V$ F" K7 x
# q" ?6 _% a, {% ]7 h& m enough_data = 0;
6 B V# o/ w+ r! e& c# o* Q4 f: E' C( A" _$ u8 ]
// if(enough_data>50){" `9 d4 a8 p5 s: d
// enoughDataFlag=0x01;8 p! N8 Y+ l& @! Z- I9 J
// }else if(enough_data<50){' b) O' y5 w! b# j0 V0 z0 O: S& ?# U
// enoughDataFlag=0x00;//0x00还是不行
( z* r3 S( V5 Z' O// }
/ G: D: [# K, L4 N; |2 H' w
" M' E3 x+ O6 {! k6 h
! U& x1 {% N) D1 Z9 `! N4 F oo=10;$ b6 e7 O, y, { h$ q3 I
oo = oo < 5;
) H- V" g5 K8 k0 p! x* e if(oo){ O9 W7 ~- E8 M# i: G `" _
ii=0;3 c& S" i( E+ B! G. c1 C
}
& j. j. d% ^- @" E' t if(oo < 5){
' L9 Z" \4 W4 h ii=0;$ \7 p3 N2 y& [7 j) h5 \5 c
}
?( R* n+ y- j: R' V/ P: N' j if(oo > 5){
$ F: X& d2 j1 m7 M& y ii=0;, u2 a2 n9 V0 H. M% h+ s
}
9 `2 W/ a! x @+ p0 K% a2 c$ Y1 H! b2 P( p" t
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
$ T1 a% C! x$ g$ u /* 如果数据足够才执行主程序 */" l3 T- e, u) q& o/ _3 Z
oo = oo < 5;/ W8 p/ N n; Z8 @8 Z8 [
enoughDataFlag = enoughDataFlag < 5;
( R: {' |. Y" E$ |$ E( { if (enoughDataFlag < 5) {1 I* T# b& v0 M5 e& ^
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
8 V0 W) U9 q5 u1 A AGC_AGC(&pAGC);
8 F0 ]9 C( Z* P$ Y+ Z" y: I
: z t- C9 G* ^ l, [3 \ c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);& w/ p8 B) z5 }2 ]+ E1 Q, `
FIRDecimator_FIRDecimator(&pRxFilter);
8 `- u$ S# h# D& A8 H5 \7 N. u( B: b; e2 X" U- `, R
/* Downsampling */
3 u- ^7 w$ F1 Z c_SymbolSynchronizer_SymbolSync(&pTimingRec);% b- S/ Y" o5 `$ L
& G( o x9 d% h# p# x4 [ c_PreambleDetector_PreambleDete(&pPrbDet);
+ |( w/ S* T. y* B$ ^& f1 }
7 \& I' D: q; c9 Z2 W* ^. O% X /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
& ]% m4 S: `' W: v" c9 q# @& k /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */$ x6 a, R" l5 ^
/* %帧数量=100 */
4 Z0 Q; g ~: Y8 K pFrameSync.isInitialized = 0;+ [9 s5 n0 [* C' D+ v4 C
: O! z7 D" ~ }! | m
/* [EOF] */+ E9 {$ X+ t! V7 u' P( A
/* 前导码长度是13 */
. f2 k* Z8 H- A7 M /* %qpsk */& S; b4 @9 L' @
pDataDecod.isInitialized = 0;
+ P/ H1 Z) C( M4 I1 M% [
( S! V+ _6 c& M3 P4 X /* end */% S2 N9 G; I0 q9 h$ M( L1 x H6 b
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
2 B4 i/ ?. B6 W G /* Convert 3-dB frequency */
2 X4 u( o% P' y2 L, u3 E/ x /* Convert 3-dB frequency */) E9 J7 w, g- p# z9 W- l7 T
filtfilt(save_buffer, usable_left_filtfilt);' G1 X; H# S+ N$ I5 v$ F" s6 S
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 f; }- ?- t/ c; K& P" I& E/ w' H usable_left_filtfilt[ixstart] *= 2.0;7 y& | H! _& f- a) ]) b
}& l2 Q2 V. o ^) g. t
! o- c: i, D3 y) A7 j
/* 注意乘2,处理幅度 *// I2 {7 T% r- h. x7 H) F0 o
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */) j# g3 F. l: j7 w8 \# K6 m0 o0 m
/* %% 行列转换 */
: w& @& u, r6 L, k, T yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
9 V L) A7 g: A1 P/ y for (ixstart = 0; ixstart < 81000; ixstart++) {
8 P D3 q/ C- C( ^% f" I( p/ f8 p youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
5 A& t/ D" q* B% G* J! ? - yiDuanShuJu_mean;' B; a' B* v4 \& Q" f6 z+ J: U
}
6 G+ b* H/ W' ]7 _- i; d
% b+ E* q/ n6 ^8 p0 d! ` /* %% 应该对数据归一化,但是这一步放在哪比较好 */
5 v1 \% x3 e- a% o ixstart = 1;
( E- d& e- M! v8 S" {' o mtmp = youXiaoShuJu_QuZhiLiu[0];
& N$ k0 p/ I s if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {/ O7 |3 \* Y' b& k+ i7 s* n& }
ix = 2;6 g. o/ t2 C) g8 s
exitg2 = false;" f- b: ^- p1 v. U1 i. t6 j
while ((!exitg2) && (ix < 81001)) {
) W0 l" K3 R. X5 n% \6 C+ C: o ixstart = ix;
: ?" h- }5 i+ c- s' \' j. M! { if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* N+ h% @/ W$ X. ^4 O3 x! I mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
, L+ L1 s3 {4 k exitg2 = true;
, ~' l& r1 \. ~! v5 f } else {
[" m8 \6 i9 ^; `5 _9 ~% S5 M+ | ix++;
& a( m' }8 L8 z. z4 J/ e! G: e }
$ y' a1 e& D6 d. k% S; @ }, u/ |2 c8 \$ v' s9 C$ {
}5 T. D2 _+ q& \2 F: l3 c
( j0 R) a7 p( ?: b+ M) ?/ K5 c! @ if (ixstart < 81000) {
_: g' w( W' S6 i1 s while (ixstart + 1 < 81001) {. `3 w6 H$ H( ~" P8 q' @4 i! |( r
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {9 U) M! T3 a# x
mtmp = youXiaoShuJu_QuZhiLiu[ixstart]; l/ j" e3 \: I
}
$ o+ `3 u) K M; _" W2 S# O$ A% ]% j2 _
ixstart++;. w$ o/ ~- j$ q( u- W; M. ~
} B% K( I1 u z$ j
}4 ~4 |$ I+ t* B; A. G9 h
" p6 R, H# ]7 f8 `6 O5 K ixstart = 1;
* |* j& ^, E( ~% l6 r yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
3 [2 F2 z. z: ~ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {) R& E! k; _" F% r5 J
ix = 2;8 S. r- r$ t0 J, n& l
exitg1 = false;
% E0 ]1 G3 O1 T* i while ((!exitg1) && (ix < 81001)) {
& O$ S: A& P/ E ixstart = ix;, a# O, J+ _& l5 X i( T
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {0 e' t/ ^0 y9 X; C( h8 r+ Z H. A
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];% T" z+ P* r j( J4 b
exitg1 = true;5 t# v2 r6 ]# F9 K: Z8 ]
} else {
( a8 D* M7 _; } ix++;
1 I& p3 n$ X/ A0 C7 e, v* S9 V }
% V- H$ g7 k* Z }
d/ Q5 z K, B, S& } }3 }) ]$ y3 G! x% R
* @0 U) t) U& K+ E; C; i3 i: M
if (ixstart < 81000) {8 Y4 Y$ [* [4 F, m1 F: }
while (ixstart + 1 < 81001) {
z. P+ c- B* I if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {; B U: ^# w, }3 F% k+ E4 } [
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
' F4 @9 q+ ?1 U* g( P5 y }
, [' O" L; I/ h3 g+ g' w) G& B; q% ?3 r. Y. W, H. y4 w+ P
ixstart++;1 J. @, e; \3 @( Y
}
P5 @' _' v, _$ ` }/ b& p+ E/ T/ L
9 o0 T4 l. y3 _9 V5 U
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
! a6 v1 |3 w p0 b2 ?" ]' y if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {+ V* p8 W- C% }0 K4 e8 ?
yiDuanShuJu_mean = mtmp;
4 P4 R H% i9 f% w }& d8 ]0 i$ `: l2 M0 q
' w! c$ a+ a: R% {/ T1 r2 ~8 W /* 找出极值 */" I! \8 r2 `4 t
for (ixstart = 0; ixstart < 81000; ixstart++) {
% w0 S/ }( b) z G, A& d2 } youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;$ q- u/ J; w6 x' w+ n
}- \1 D- m5 H% L" ^
9 ?! g/ A1 l. F6 y( y& U. |
--------------帖子字数限制------------------+ s5 j# @% Y9 {! T% r, D
}8 s6 y5 e" i3 j, Q
9 Q' `. T7 ]( p( f; T5 Q# P' d: u9 Q4 B2 }8 V8 x6 \
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|