|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 % r; G$ H( X% ^" L2 a' @, O5 B
v( ~+ h1 ^7 C# @各位大神:+ e- o( t; ?& W5 p* C" H
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)4 ]1 P! [& N' U& j
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
7 K$ K, U) p% t" g/ ~. r5 t7 v: w( a$ A, p1 S- \$ f
t5 q+ H+ p6 m" E4 r+ \ V这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。! ]$ u4 N+ J2 m3 y
$ C+ Y6 J0 E+ _# a7 B; t4 K
并没有其他线程
@5 {6 x1 S' q/ n$ x+ A反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
2 t# F- D5 C0 f3 l1 k# }也说不定是和堆栈有关系。。。。。。
7 k" c$ ]' W* O! o; y请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
5 Z- I* Z& V1 b; k# K
# F7 V) E$ ^* ]( a
; i$ M2 S# Y* ^/ Z O2 F/ c/ Q5 X2 a/ u: ^2 B3 W3 t- R1 o
我也很绝望啊,希望大神能帮帮忙,感激不尽,!& q/ t; i" p& [; Y v
& N- c0 E6 ?- G
, o; j- u j2 T6 m. T3 r附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000]; j- z* _ p! C6 `8 O" v: P
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。; [# l! l8 a) h7 H) q* \
7 Z1 w( d& j0 a
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
% e' P& k4 p+ Z+ i+ d const double data1000[1000]) {4 Z0 N1 S' ?# a" ^
4 _' V# U7 r# Z, {
int myfuck;! u: W) h) }, w9 U9 R/ p2 D* l
double yiDuanShuJu_mean;
4 {" ?/ ^& h" P8 X; `5 A8 l- | double yiDuanShuJu_LowMean[1000];. z! a+ X p0 d# h
int ixstart;' c4 a2 {# ?* G; k8 u% e7 g
double dv0[1000];
; @* s1 O" R, b comm_AGC pAGC;
" D; h c3 I6 ? comm_CarrierSynchronizer pFineFreqCompensator;
8 s5 _4 k' @0 D* A* l/ F dspcodegen_FIRDecimator pRxFilter;; ^/ p: k- F9 V
comm_SymbolSynchronizer pTimingRec;/ J6 j4 c' f/ J# v% p! d1 q1 g
comm_PreambleDetector pPrbDet;
% D% j1 r5 J, Y3 ^- i8 Q0 [ FrameSynchronizer pFrameSync;
$ W `: r1 f. e3 F# ]- x' n QPSKDataDecoder pDataDecod;
+ M G# X. t9 j$ Q1 E static double usable_left_filtfilt[81000];" I, k: J: L& |! n! _$ y* V2 `
static double youXiaoShuJu_QuZhiLiu[81000];7 i8 e' _. h1 \+ \. b3 g; I5 ]# x
double mtmp;
" s8 m; U6 I- z3 ~ int ix;' B Y5 d: @6 [8 N1 {, f& I w5 u
boolean_T exitg2;
2 ~' m; ?: S9 M9 L. @) w5 ` boolean_T exitg1;' Q3 \- D* X& F
double YiZhenShuJu[800];
6 {6 f9 P; k3 f' ]7 B3 q3 O9 O double dv1[800];4 ?+ O5 o% s& G8 V. w
5 u. m- H. j5 Q; B5 e1 u
' p3 [& \, e& c* C: N6 R/ F2 R* S double b_YiZhenShuJu[800];! \$ [0 `* C% x7 F) `: r
double I_filtfilt[800];
4 O/ t4 h9 H6 } double Q_filtfilt[800];
# Y( Q; l) e2 t: R creal_T b_I_filtfilt[800];
4 | b* h# C! v/ k2 L creal_T b[800];
9 f! B P9 a0 Q( H' p creal_T RCRxSignal[50];
7 A. {: s. D7 K! s$ L creal_T fineCompSignal[50];
8 Q! M7 c* V: ]9 E8 G8 c double phError[50];
6 D5 \, ]) G$ d- R% s creal_T timingRecSignal_data[28];1 l- u' \0 V$ @+ f {
int timingRecSignal_size[1];) b: c! j8 K% o5 z9 t' g9 q2 G0 X2 U
double prbIdx_data[28];
9 D/ }4 H4 Y+ [2 Z int prbIdx_size[1];) Q P) T, A5 u
double dtMt_data[28];0 b! k# u; V3 T! h% c- Z
int dtMt_size[1];
' X5 ?1 n P& N* ^0 [ creal_T symFrame[25]; f$ f3 y4 B) M2 o
boolean_T isFrameValid;
& ~7 V- B1 `) ]* z0 H: D3 z% l" V double unusedU0[3];
4 R' l8 d- l9 L
4 S. T# a! [; `/ p/ I! p/ t //调试过程中的变量
( c/ h0 z; _8 L# J9 q$ U' L+ _ int enough_data;
3 ~) W. m1 q) [* O j! |) [( W/ l$ L" H e
int enoughDataFlag;. n2 o1 v' ~" o1 P' _& O
int yiDuanShuJu_mean_int;, k+ L# Q1 |0 H: Q. O9 A
int int_sum_dv0;7 `4 d# X- `7 }; r- S2 x
int oo;7 f$ W5 O# e; F% A
int ii;
* |. A9 l' |( A1 W2 f myfuck=10;0 e) b5 n; w, F( S
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
, z$ ^1 ]# b' G: b /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */6 H/ R3 S( C! {
- I, E0 \3 K+ {
yiDuanShuJu_mean = mean(data1000);
' c* X! y. E7 A
, k+ Z' p5 O4 m4 W8 v yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
! z# B" z/ Y! ^9 }2 x* F UARTPutc('A');9 o7 a- _& q" m7 v8 _
UARTPutNum(yiDuanShuJu_mean_int);
, b. Z2 z y$ f& [5 v UARTPutc('\r');
1 M( W% o. F9 m& C3 @# Y UARTPutc('\n');1 `$ p. a8 O& m# o: V3 f
2 }0 s% ^( H4 @8 J, [' D4 p for (ixstart = 0; ixstart < 1000; ixstart++) {; O$ J) R/ R8 N, b9 U+ I9 [
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
# G" @3 W: F1 R, i }
4 Q3 U2 S5 w3 K0 S6 k; y$ x0 Z% M2 M; b, p
power(yiDuanShuJu_LowMean, dv0);
& `% { `+ p/ q& t; R0 [) \* l# Q9 L$ [& K& W Y; y6 [
int_sum_dv0 = (int) sum(dv0);, v- J1 t8 z6 P9 ]0 T+ \+ c
& E/ v, d) }6 `+ [$ n! o
UARTPutc('B');8 a( c" X! b6 J) H6 m
UARTPutNum(int_sum_dv0);8 M- H' f8 G) k( A6 Z& J- {3 G
UARTPutc('\r');2 z- R* Q6 |4 I$ r/ |- v: F; r
UARTPutc('\n');
8 w9 ^* f) t+ k9 ?) d: z' G& Y' c3 S \" _; x* s" g
// int compareFlag = int_sum_dv0 > 1.0E+8;
4 c; [7 g% y6 \7 J) E/ P: ], F$ h2 j! j& i: L7 x* y
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
% d; t H& m) w UARTPutc('C');# `" x" [5 b7 V* T
/* 比较信号能量 */
! @1 t& J( C/ z+ S: A /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */% I+ V5 S) D# ^* c
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
; o7 P3 k. E8 _# e// for (ixstart = 0; ixstart < 1000; ixstart++) {, L( M) [' Y, A3 ?
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
# N$ J' y" g# O// yiDuanShuJu_LowMean[ixstart];
% n* W7 U& V% q( }1 D! f+ X' A// }
; m1 o+ u0 q1 g {! B//5 f9 f; J0 P6 Z) a' T% a" O
// youxiao_k++;
- F4 b8 A4 i! P) Q// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
, J9 T- h5 K$ L8 F' a! F j; A4 c+ G// /* 感觉要取21个数,即0-20, */& O% b+ _, I' X& m$ o7 ]' d
// enough_data = 10;//有效是10,无效是03 U7 r, t# p3 B. H, w8 Q$ a9 X: ^8 }* k7 F
// }
! C+ z7 q. A& a0 L }: z2 b% h9 D5 }; |5 n. c% J3 E
9 S! ^ b# a# ~4 s: W% {8 V) ]1 k' v
enoughDataFlag = 100;
0 G7 K9 N6 H$ u7 }0 w2 d enoughDataFlag = 1000;
g0 Q" D# C4 u6 N! |: Z( `( H enoughDataFlag = 0x02;
4 H: @: W4 V' q# J/ S( e enoughDataFlag = 200;
3 ^9 D3 l* _8 [3 t/ l7 _0 @, G$ T1 }9 g' o
int myfuvk1;
; B# L, B4 T- W myfuvk1 =11;
/ B8 L }3 ?5 G& f/ a
4 {2 @ x/ A& t$ {/ X' F% \# F3 B+ {0 X$ [4 Z
enough_data = 0;, Z# o1 w W; a6 f9 L- C
( m; W$ P6 C1 V; F3 D( m! v/ Y
// if(enough_data>50){* k s; d! t* S% ^5 s8 e
// enoughDataFlag=0x01;
% H" y- O7 k7 b8 z// }else if(enough_data<50){
, F+ r O `" t// enoughDataFlag=0x00;//0x00还是不行9 V! R' P X. M' c+ @; ^- p
// }5 z+ p# J1 N# V
( B& q( P: ^, n/ @% s' B$ M
" K7 U; U" Z# m! v2 @: T8 [ oo=10;2 g. Y/ O. B8 O' ]6 L% Y6 m
oo = oo < 5;
, V- [7 H' b7 h if(oo){
0 j5 w* Y7 T* H ii=0;, N1 o0 U) U k( N7 P9 i: l f
}. Y2 E, V6 w& M
if(oo < 5){" q6 Y7 T4 o& ^) o/ {6 s' _7 g
ii=0;
$ [+ V* x% h8 T2 ]6 i) f- v }" S8 p/ B a' d$ Z% I. v! F- ?
if(oo > 5){
7 G$ _! B$ Q9 C z3 G/ I$ C2 @ ii=0;
; Y# {- ]% K! V* i( u. a }( H9 Z: M6 a! B! m* h
4 a9 i. x- _3 k$ S
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */$ I; W: l8 r' T) O1 z. y7 ^
/* 如果数据足够才执行主程序 */% a% B3 e' b* ]8 h
oo = oo < 5;. X5 K( l( r8 ^3 i d6 w6 [
enoughDataFlag = enoughDataFlag < 5;
$ V5 b$ }& Y; B+ v# _ o5 r if (enoughDataFlag < 5) {
' i6 Z& [- _, o8 x Y// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0- H4 U- l: L8 ?+ b1 ]
AGC_AGC(&pAGC);
. N3 p& I5 ^1 K: }) [2 F5 Z/ y# g `6 U6 h' H. J
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);. `7 B- m8 L; U! X A; }
FIRDecimator_FIRDecimator(&pRxFilter);6 [- F! _$ J x5 q/ R8 s
& n5 {4 Z( Q) A/ L, y
/* Downsampling */
+ p8 z. s9 X- F. q7 ]) r c_SymbolSynchronizer_SymbolSync(&pTimingRec);
1 p& Q3 F. ?- K0 p* Q. O6 L, }- I* _: l) S9 y
c_PreambleDetector_PreambleDete(&pPrbDet);2 a- z9 Z2 ^- s; [) Z+ P5 A& D
+ x0 |2 b ?1 G: y. [8 v2 | /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */' ^( E+ f, y* u
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
0 u% U# R+ \2 [ /* %帧数量=100 */2 T! W. j9 ^& e7 F
pFrameSync.isInitialized = 0;
, V+ S& q- n: \) p% f$ _: K8 c+ ^4 |+ _2 L2 y7 o8 B6 R& v; l1 @
/* [EOF] *// m8 O; k1 o$ n% Q" `( t
/* 前导码长度是13 */
4 _; E$ q2 u: V7 @" x) o- _, R, s /* %qpsk */ t9 z) P7 f3 R- n6 q+ c6 w
pDataDecod.isInitialized = 0;
) \0 v, E1 i4 [+ j
% L7 _" Q( {. T) c* _$ U- r7 G& q /* end */
2 v9 o w. [2 q1 b0 @4 t( n: j /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
9 |: w& X$ V3 w& D /* Convert 3-dB frequency */8 Y& _! W$ w5 W
/* Convert 3-dB frequency */0 m* R+ B, l7 m6 a
filtfilt(save_buffer, usable_left_filtfilt);7 X2 C' h1 O7 m* S% H
for (ixstart = 0; ixstart < 81000; ixstart++) {) R) b( F7 k0 S& x7 j: f
usable_left_filtfilt[ixstart] *= 2.0;
4 @$ ^5 A: u. R" {0 Z }
. J. z, b, T: s: |, [/ D: V) y6 {" T% z: U$ v/ I7 i
/* 注意乘2,处理幅度 */& y0 d* `3 @ f
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */7 {+ s' x0 } d5 m0 E5 x
/* %% 行列转换 */ R# Y% c, `8 Q; n" p( }- m
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);2 c8 @3 s" Y+ Y( a
for (ixstart = 0; ixstart < 81000; ixstart++) {
0 D% I5 \4 y6 [5 ?6 s& y& X youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]3 y0 l- X* z9 ~2 s3 ?
- yiDuanShuJu_mean;# G, d1 V8 r* k# s6 o3 o
}
. d9 z; G8 I8 [* K1 X% `, g+ t
# p! S& H! O( v+ K; Z /* %% 应该对数据归一化,但是这一步放在哪比较好 */8 l/ j. E4 y# i* Z) O: r7 c: }
ixstart = 1;
8 t% G1 p- V5 T8 p# M& K* h/ T6 [ mtmp = youXiaoShuJu_QuZhiLiu[0];
/ K9 \2 s B% b3 [: M8 P if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {+ B. c& _/ V9 y! I- `% _( D
ix = 2;; x8 Y; w& ?& @$ j/ c
exitg2 = false;
* L6 U/ d4 R# A( K while ((!exitg2) && (ix < 81001)) {
' ~. b1 o3 C! m6 L& n3 V# C1 y ixstart = ix;
+ H. K# q% O( R1 c/ ? O8 v& j if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {; [5 I! }5 E9 B. i
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
" O9 t* L) W" l l exitg2 = true;
1 l! n6 G9 y9 h } else {
. e! M' c; P6 f4 C$ Y ix++;" p1 J3 J8 |9 A5 h8 i# p
}2 G. d/ X- F( ^. l$ W
}7 U y, q" {( Q
}1 h$ [3 C1 F6 d2 G
9 d0 @. m" C( ~7 B7 k
if (ixstart < 81000) {! _8 ]; G& L9 _# W# H& c) N$ ~1 Q: X
while (ixstart + 1 < 81001) {
. {' j0 X3 l+ \ if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {( p3 r# k: o" X5 a8 H
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];2 b4 T* N$ D a8 b4 @4 X( Q* C& R
}
: O/ L' u' F$ f) O' C! a
x0 H" ]( ]( e( x/ U' f! B ixstart++;
; F8 c D- U' Z }
% x4 j; d; V' z# S! n }9 m8 j9 T$ e8 H" F: u1 K
7 w/ s" A' { |& z+ q5 Q* f ixstart = 1;
* e% W" b$ w: Z, [/ \5 f& K. h yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
4 f* x# C, Y' h+ q6 k if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
* ~5 w, M$ n6 o ix = 2;
; N: M1 w/ D: X( a( A& q0 y exitg1 = false;' f1 P, L4 a& n3 h6 n( S
while ((!exitg1) && (ix < 81001)) {
; a$ g& n# P3 T ixstart = ix;
6 @" r8 Z1 B( l( Q" R# V if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {' g% L( q7 H4 ?+ Q/ h
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];, f1 U$ {8 |: y
exitg1 = true;8 Q8 d7 y/ z2 ~! t, g% J' X& W
} else {
% v' Y) z5 B' s ix++;$ s7 d4 u/ L8 f f! g( o/ M
}& h! R% ?2 r0 O, f% i4 W0 m/ N
}9 H- E }# \/ I) j
}6 J) M0 f* }! Y$ o: i
& I8 E; g5 ~' f! D" ?9 I if (ixstart < 81000) {% a3 ~5 J4 o; V$ C2 U
while (ixstart + 1 < 81001) {
$ a1 p( U" @2 j) ~( c0 } if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {1 k0 h' a& h+ h8 e% } i
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
2 r& P3 Q8 g& i: D6 O. x) Z }1 H! s6 ~7 B* ~& e; S9 O3 T
! G3 K7 {1 R0 i
ixstart++;
( d0 A; b/ V: @7 O" X- h }
2 S8 F8 V. \& T9 X4 u$ L, n5 ]9 ? }/ P# g+ o& V( h4 A
. K4 u3 P: Y" u
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);! r% M* b/ }( \' F! S# e. h
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
# T; ?( o N; T+ V3 \) I6 ?1 V: I9 \' w yiDuanShuJu_mean = mtmp;
' }! A/ [: l, g; A4 W }: ~ {" U+ n w, M* G( e. l# |' }
7 @) k7 k) @8 m; ?, o
/* 找出极值 */
# q' q+ X: q* ]! x for (ixstart = 0; ixstart < 81000; ixstart++) {8 k' P Q8 B, D
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
' a$ U6 d. q; h' Z2 B( k B: O }! j& f8 R/ c$ W( ^% ^
+ F; H' v5 `! M5 Z
--------------帖子字数限制------------------3 Z, Z. S S4 ]3 Q) A8 a3 x
}
1 f+ L1 V/ c# C+ f0 z% I+ i9 F! R0 _8 K; \* R
' _0 G- `% a& K* P( n, H, g; @" P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|