|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 9 u# k: f- V' @1 j5 @
' {+ |9 |4 f" e* A- ?
各位大神:
! a% S6 h. T7 D/ u1 P( W 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
2 C5 G2 a% M! L, c( ~% f4 b' e5 V8 l 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:) S7 M! V( A# o1 d5 N0 D
* a/ M3 \' |( L" A: v! H* ]
/ H) [1 }# R8 `5 o
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
: m, C O! |+ s' d8 o0 `2 C( W% r( y$ e) k6 w
并没有其他线程. E7 F9 r9 _$ ]2 A. [+ B
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
B y: \! g) \! e6 m7 ^' u* j也说不定是和堆栈有关系。。。。。。
5 k, i" f4 h! P; O' e- o4 n& ^* a请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
( O5 U1 ]! z/ O( g5 p( q
1 c Q8 I9 M n8 \4 Z+ }: N- l6 l0 K g' i# }8 N* `
( u4 P" R, A: H- Q. F6 D我也很绝望啊,希望大神能帮帮忙,感激不尽,!
" R* n l. Q- V% V& i( }) G( Q' Z; `0 q: s( c. E4 D/ z. d
) v8 `9 E$ [& \: F5 I+ Z/ p
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];4 B4 ~' x- N5 T
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。) X; e- w5 [% a9 A: o# i
( u/ G! {2 P! d3 g
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
7 r1 E. g G; z' t. |# a const double data1000[1000]) {. P" f; _' [: N! M
' k/ L5 L* @+ M8 H: }4 y4 ^
int myfuck;* C+ `# i7 O" S; T( @& j# g
double yiDuanShuJu_mean;5 f* y. g' K: |( `) A) k
double yiDuanShuJu_LowMean[1000];, s' v0 E7 C; X) a' ?& @( s" F+ A
int ixstart;
4 T- ]# B, N- g double dv0[1000];6 g9 M0 p9 x3 ?* K. [3 l- Y
comm_AGC pAGC;8 J# @6 A- V ?
comm_CarrierSynchronizer pFineFreqCompensator;
f6 }9 E, W% S& z! E8 y dspcodegen_FIRDecimator pRxFilter;; [2 x9 L3 U4 c1 B9 `2 z+ V
comm_SymbolSynchronizer pTimingRec;
$ m! y, Z( L. ^- g$ A comm_PreambleDetector pPrbDet;+ \$ c& y I; O5 `0 \; X
FrameSynchronizer pFrameSync;% f% D) F6 R" R. H8 A& `) ^
QPSKDataDecoder pDataDecod;
+ C5 O& y" J, S& A static double usable_left_filtfilt[81000];2 X! ?6 l: ^4 P' M
static double youXiaoShuJu_QuZhiLiu[81000];6 x& ~' k1 O+ X( L- R
double mtmp;
! Q/ | U* G9 t w) s, G! r) G2 {2 U7 v int ix;/ G4 { _' r" v) M% R2 ]& @
boolean_T exitg2;3 b6 \; B- L& X6 F' j+ Q, d
boolean_T exitg1;
; T% R* \3 T/ p# @* ]) B6 A0 b double YiZhenShuJu[800];- q3 J* H h$ [9 O" O
double dv1[800];9 j9 ]# Q2 D4 J8 u7 p
1 |* V4 g# {0 M; p$ I
% S$ B; W# o5 J* |0 ]* A1 R- I
double b_YiZhenShuJu[800];4 U8 R2 g4 o# r4 j& c' ^
double I_filtfilt[800];
7 v$ w9 |, I+ m: D6 T, m) @! X double Q_filtfilt[800];) y2 ^* D3 f$ ~ x; \/ K
creal_T b_I_filtfilt[800];' j; ^. Q' X0 Y- b; c4 _* I
creal_T b[800];7 l5 X2 I# V- `$ j1 U* |. ~9 a7 X
creal_T RCRxSignal[50];1 L4 X3 w: ?: k, q
creal_T fineCompSignal[50];
, w+ x! J v8 U0 q |5 _* G$ ~ double phError[50];3 V. j% @5 n! y+ k0 L9 x% ~
creal_T timingRecSignal_data[28];
; `; |: F; x5 |/ ~. B( t2 X int timingRecSignal_size[1];" `+ u$ p( ~, a& g+ N1 }$ H& V: ?4 u# V
double prbIdx_data[28];) i5 X% @5 e6 E4 a. \" C, r
int prbIdx_size[1];
_! }/ p7 C( O% X1 q8 O4 n double dtMt_data[28];; B8 D L# E8 W% N. J% C
int dtMt_size[1];; v# }, K" N6 {* N. d) k
creal_T symFrame[25];2 ?* x4 ^( ] A, [4 \3 E
boolean_T isFrameValid;
: H1 }" R7 K* Z5 b( e( }4 h; Y& A. A! A double unusedU0[3];
- R5 `0 @* c! K8 P8 r( [0 o: j2 M' O# l
//调试过程中的变量+ ^ m; a) C% e& q6 V
int enough_data;6 e# M% D1 B+ o8 H
$ h5 I/ G, q' G/ M6 Y
int enoughDataFlag;
' d+ d5 p" Z& p! h+ I int yiDuanShuJu_mean_int;, ~: r) e0 j) w, m8 ~
int int_sum_dv0;
# h# V1 c$ X9 s h! q; z% ` int oo;
, ]) ~) G* X5 \5 x, R! M1 L int ii;7 e! ~/ I0 b8 \+ s0 j
myfuck=10;% D. H5 k2 d2 M
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
# o; A! \9 E) P, E1 o- j0 L /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
, N( S v+ J; ~5 F, K& b6 D& u) `- S' s) o3 n/ K
yiDuanShuJu_mean = mean(data1000);
* R5 g9 _ V: ~! @+ Q" \) m( |/ r' `% D; t) ?" o
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
$ s4 e# J7 Y! }2 x) ?7 V UARTPutc('A');
, P* D; D5 b* L' K5 e, c5 v UARTPutNum(yiDuanShuJu_mean_int);
. p9 ]% n% x- f$ p; U5 w UARTPutc('\r');( @. F. }3 P; x F5 B- [
UARTPutc('\n');- a5 S. k/ f6 X: I5 H
8 i2 o d5 {# z2 |, B
for (ixstart = 0; ixstart < 1000; ixstart++) {
% _" M' I# S3 V5 g3 B yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;* W* \1 Y* c# A' n
}
6 b9 d9 Z, f3 O9 z# o* k% `$ |3 d
% k) z5 r6 a5 z5 B6 [* n power(yiDuanShuJu_LowMean, dv0);
5 b8 t& X: U! e0 A* ?# R
) c! v! u% D9 T6 a int_sum_dv0 = (int) sum(dv0);, K$ m6 a" X6 n( M* f; K3 c
3 k- Z' t, d' a" U& ^ UARTPutc('B');7 L' M: D# u0 s) @1 ?/ M
UARTPutNum(int_sum_dv0);
( e( a4 r4 _* ]) {8 |5 I UARTPutc('\r');7 O& D. _: N& n7 |. S" y
UARTPutc('\n');
+ E: L% e u/ [" F
" J2 n0 v3 B% Y$ {2 K// int compareFlag = int_sum_dv0 > 1.0E+8;# r$ ?% S8 A2 j0 M
7 D6 Z# ]4 E/ W
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?" B5 B5 `4 B/ |# o6 H8 u; x& `1 q* l& l
UARTPutc('C');
! }' D* G! t5 i( n /* 比较信号能量 */$ C$ J1 _) Y% ]7 Z7 x U- S' a
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */3 }5 u$ E- \3 C. ~- T: v
// yiDuanShuJu_mean = 1000.0 * youxiao_k;) \8 f/ Z. d. o Q; k4 e8 P
// for (ixstart = 0; ixstart < 1000; ixstart++) {, I3 ~3 h4 D' x3 ~, t( ]3 i
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
6 _. [- O5 M5 f// yiDuanShuJu_LowMean[ixstart];4 Y+ E$ N5 _1 A. K( Z7 t9 U% C
// }/ a, x/ s! g' X" T/ N
//
- Y3 X6 m1 ~( k& U) L x// youxiao_k++;
7 v7 V' y* a m# a// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
% D* a* ?% s5 I// /* 感觉要取21个数,即0-20, */$ g! Y( l4 f. ^3 M! h* l! O$ C2 I
// enough_data = 10;//有效是10,无效是0
. \/ q2 ?/ z0 T' t* B5 E x1 G0 n; a// }
1 @! J" e5 b% C6 Z1 D }
- q7 h- I8 D9 {) R9 b: @% J- S1 u/ h+ K
; m. E6 e E1 ?; f
enoughDataFlag = 100;
, C3 U/ c7 b1 Z( u: F3 J( J enoughDataFlag = 1000;( E6 ]# v# v) l
enoughDataFlag = 0x02;0 v. {2 C, g+ V) l/ G
enoughDataFlag = 200;$ P# C7 @( K* e( i; Y
0 g3 t3 k- t5 p0 Y, K. w/ ]+ i6 } int myfuvk1;3 m9 A/ {# [/ x5 I- V8 P
myfuvk1 =11;& z$ v: @0 M( x! @* h
. {. A* J- p5 d q9 V; c w5 {
1 |4 V. R; J; B enough_data = 0;
P, d6 r3 P6 `5 B# q% K
N. k# f( P2 D4 x. x4 i) k// if(enough_data>50){* c+ ?7 s6 B' M5 O: A+ ^% ^
// enoughDataFlag=0x01;
% z, I* U" Z P- \* i// }else if(enough_data<50){
M+ m4 `* y3 `// enoughDataFlag=0x00;//0x00还是不行% \4 Y% F- E! j1 j9 a
// }5 E$ f5 c+ i! v; F
3 u$ _% ~3 a/ B; w4 Y+ S, X* h# S1 E( P4 V a6 y& s) T. ?
oo=10;
5 X7 ^, L8 A$ S) B- _6 t' C oo = oo < 5;6 }6 k( e3 @5 O
if(oo){
4 [4 t4 U) u6 [5 d. ^" @8 V ii=0;* x: u5 x% R) n
}6 D# |4 u9 d; X9 K( [' t0 `
if(oo < 5){
3 Q- i6 \3 V3 [" S6 ~. K ii=0;
( J4 A. [3 z2 o- l }! ?3 b: B8 V/ D5 m
if(oo > 5){ `' k8 Q9 M' m% N% n6 _
ii=0;
5 r2 W: ^, e2 o% r- H, [# u; [ }8 U' _/ C1 B" _% X* Y
! o) Z( h3 Y- \3 d# O
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */0 e+ f, b+ u9 g
/* 如果数据足够才执行主程序 */6 K0 y: _- x1 z( z7 r' V
oo = oo < 5;
* c; u5 q; l3 K9 R enoughDataFlag = enoughDataFlag < 5;4 t, T8 M+ C- I4 c9 B8 o! j
if (enoughDataFlag < 5) {7 I# `5 K# n; d+ b
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0. h" ~2 {9 |5 |( A, w# E
AGC_AGC(&pAGC);* R, L- W* B* k
1 }7 f& N0 Y2 Q+ W* n c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);; ^) _# o: {) h0 u6 K
FIRDecimator_FIRDecimator(&pRxFilter);$ D+ O7 w! q6 F# i6 b) i
& j \. E5 u' R4 i; ` /* Downsampling */) [# Y0 F: M4 D y/ J( {
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
1 ^4 } V& z/ j! ^8 e6 G4 L) e# E
c_PreambleDetector_PreambleDete(&pPrbDet);
; a; S$ I# j) l4 K, c2 X+ n+ D* V% _ z8 k7 l
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
, w0 `$ U! C; y6 R /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
' V( T# H4 Z3 E7 i( ~5 A# ] /* %帧数量=100 */
6 B" L) N3 i% h9 ^* ? pFrameSync.isInitialized = 0;
* o3 n6 Q/ j% r! O& ]' J; s, v; Y5 N) t) @! D
/* [EOF] */: V, \# p% \- u' z- K; u1 N, N
/* 前导码长度是13 */
6 z' ?7 ]; c, ^; p /* %qpsk */9 O! ^# Y0 x+ z+ q+ y
pDataDecod.isInitialized = 0;4 V% J4 l1 a- y$ `
2 f/ Y: V$ Q$ w5 \7 r /* end */
5 k. `& H& y7 c% U. T# s' d /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */! `+ Z! m0 }& u
/* Convert 3-dB frequency *// m5 O- V8 W. g' c
/* Convert 3-dB frequency */: Q# d" k5 j. `$ s* T8 B, e
filtfilt(save_buffer, usable_left_filtfilt);6 q; K" n: R1 q' u* M1 d
for (ixstart = 0; ixstart < 81000; ixstart++) {
+ S3 G/ Y |9 f X5 Y% U usable_left_filtfilt[ixstart] *= 2.0;
4 I0 M* G- O5 `+ } }
, I6 x( ]& L0 Q s1 B* M$ S' D+ G z# E9 A H/ k
/* 注意乘2,处理幅度 */
# ?; Y- G d# u) w* R/ s- g /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
" e# r3 {( |( A /* %% 行列转换 */- Z( e$ V g+ ^# T% ^) ?6 b
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);4 x" ?: ~9 T" I# U; r% h/ d
for (ixstart = 0; ixstart < 81000; ixstart++) {
" U8 ~# x5 [7 Y; U* h youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]6 M2 o0 l' k6 { g9 D" G
- yiDuanShuJu_mean;
( d5 m% z2 ]0 C- O1 R' f }
1 V# B5 R0 A5 ] H* `% o2 e' M' P5 s8 v( ^' X3 j7 R, a
/* %% 应该对数据归一化,但是这一步放在哪比较好 */1 B) D6 k5 g/ ]2 Z: o! b" r2 }
ixstart = 1;+ G" ~2 Q! F5 R5 V5 v
mtmp = youXiaoShuJu_QuZhiLiu[0];
; @8 t2 R g! F: B if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {1 q- W# k0 M$ g) d
ix = 2;1 k6 i4 q' H+ F
exitg2 = false;# O. P1 n3 t L, @- L5 K1 e# Y7 Q0 V
while ((!exitg2) && (ix < 81001)) {: Q) a7 h u; B3 W4 U% u/ }+ r: f+ L
ixstart = ix;: r, `: m) p% k8 g, @
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 a& g$ g: q- A0 d
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];8 V; a5 a/ I/ y
exitg2 = true;
* l+ x6 Y5 Q2 `8 q/ c, Q } else {; A: f" C. T4 z3 Y: C3 B& N
ix++;' Z) ] _! Y- I& m4 U
}& w C' N9 [3 m# j' R+ h
}7 ^9 B5 Q2 Q% N& h& c9 Q' e
}
2 Z5 N( c3 i. n" N- [! D( c
5 w4 u; b7 ]+ R5 h8 j if (ixstart < 81000) {
) M' R+ O6 }& A' W while (ixstart + 1 < 81001) {
0 k% G- [, k- N0 \ if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
" }( y# Z/ C: C9 ~+ J mtmp = youXiaoShuJu_QuZhiLiu[ixstart];+ k( \1 e: A; u0 y1 v8 g# `; E
}
# f W2 c7 i; @7 b& [2 `8 \$ ~5 n; e2 v( F9 L: ?
ixstart++;( p! V# g1 U) Q+ {. t0 c. u
}4 Q# M! f# v1 H4 w5 ?+ _# ~
}
2 G- \6 D4 X' s" @
, H% Q. b, k( J6 r, Q ixstart = 1;
X+ E7 S0 `% ?/ N' f2 x3 | yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
; a7 I3 ~1 }* _2 m, ^9 I f if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
9 X$ Y$ C2 T8 w ix = 2;
6 z4 Z1 r0 I6 e- e& z9 v exitg1 = false;
& Z+ v: q3 J! S" E1 ~( I) a* n4 I while ((!exitg1) && (ix < 81001)) {: J# c. r: B, }, u$ w
ixstart = ix;
+ v7 y8 a R# T) s% g: O if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {# }$ p6 Z5 W8 ~2 \9 u2 g6 l9 D
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
9 |# d9 d$ q! g6 f D }2 d exitg1 = true;( q, V: U" O0 ~/ Z7 K+ e
} else {
% B# X/ v$ t- q" y% Z ix++;2 n4 y* g7 o* M$ f( m8 K
}
* P6 [7 s6 P! p }
3 |' `' F/ y; N5 f. ~; i$ U4 m }
" G- n8 H) F6 n2 j O" G% {9 N- `! y9 a" j
if (ixstart < 81000) {5 D0 g( o7 h& Y0 e
while (ixstart + 1 < 81001) {
* z! K1 U4 ?+ f# W if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
% @, ~# e# S* j$ S$ {( z; v: V yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];% N8 `5 U. T% }( O; \' `) ]5 w
}
% m1 `9 D" N6 V: R! I$ c) L- v6 k- R( h! C4 [
ixstart++;
; O0 G: D$ P% V7 R. Q4 i6 S! G }
! |, P7 Q3 o2 m: X2 e }) H9 [: A( h2 h8 \ t
5 n" p( T& R& Z
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
! U# a: w/ Z; p" y) O9 I if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {: F" n" V8 n8 S/ {7 o9 I
yiDuanShuJu_mean = mtmp;' \& X3 |4 t$ k- |
}# j1 ]2 H- g: Z" C$ J2 |
5 d, w7 I$ O. h% ]9 {# K; t8 P /* 找出极值 */( Z2 ~- \; K% _0 J
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 C4 n( e4 A* A; { youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
. q7 Y7 V6 `7 a1 {8 E+ k1 h2 X }
4 q1 h( r4 P! i' v4 {" H
( V5 g* d% ]0 {* ~: M --------------帖子字数限制------------------
r% r# h1 @4 Q. E2 X% f: Q% \6 t! O}1 I l# s# R; w% y/ G* i
9 p& V/ x! ~9 b5 \* ?! t7 O0 b$ A
8 H8 ]8 L4 u; ?+ [+ k) w# f
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|