|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
1 I$ V* Q1 g9 g3 u! P/ c
: u4 `3 x, U2 d# Q+ ^! e! M各位大神:
' i) v- I H: v1 T4 C 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
# T) J; C. A$ \6 V6 U 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:! o! h5 x( h; R- z3 [
! p8 p% n: Q( G- [# `/ ~
+ b0 @. R ~/ T这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。; A0 g/ r0 t8 w; b, i
) s5 U$ ?3 X) x9 m& D! Q5 ?并没有其他线程
2 O3 t$ o0 j& C- G反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
; O3 ^* ?7 C6 ?% `$ t2 Z+ `3 k也说不定是和堆栈有关系。。。。。。
9 A! t) O2 @& t5 T. Z9 S# j请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....9 L& R1 M, @4 B1 t8 h2 {
2 T# P! B# O! r9 \4 W! Z0 y0 [
. m) B# R( T j) {
' C; L# }! n; h2 d我也很绝望啊,希望大神能帮帮忙,感激不尽,!
+ i. f+ w Q5 m6 p# q( i$ d& {7 ~/ |" b9 F7 ^- f2 h
6 @# q/ X8 i C, Y附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];+ \* s4 L. D: x
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
! D! _/ P4 V2 v ]2 ?
" {- n1 S( v4 dboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
5 H* K3 s% w! N/ C const double data1000[1000]) {( W% A& Z! J" K. v$ q
, j: a- n @- N) G int myfuck;! }0 d; O t- W/ S& G4 s
double yiDuanShuJu_mean;
: \; K3 W# w! r# s5 M; D2 }% K7 f double yiDuanShuJu_LowMean[1000];5 G: R' r3 L3 [/ ?: c
int ixstart;
- Y( P( Y# z- d- q, ] double dv0[1000];
/ E# |5 }. J, {- O: j comm_AGC pAGC;! y/ ?( r& h! H6 |2 o
comm_CarrierSynchronizer pFineFreqCompensator;
) e, a8 g1 Q6 W# X& P dspcodegen_FIRDecimator pRxFilter;$ N! r( F' W* R2 x2 Z: v8 M- c
comm_SymbolSynchronizer pTimingRec;! F8 o7 S; Z- M* f2 o! t3 ?
comm_PreambleDetector pPrbDet;& I) ~0 z% U; f' l3 w. t
FrameSynchronizer pFrameSync;
% n( L! D' g$ L/ R& L! |: a% n QPSKDataDecoder pDataDecod;- \' C+ w! b; J4 Q* u: d1 f9 s3 ^$ q
static double usable_left_filtfilt[81000];
% M5 Q2 G" u" n1 W$ X static double youXiaoShuJu_QuZhiLiu[81000];) `1 j2 w1 J$ b8 [
double mtmp;
& i# k2 s2 G0 q int ix;' n$ r) m% e- B V+ j' }
boolean_T exitg2;& P0 d) p" P4 ]! s; f$ i# W
boolean_T exitg1;7 K) Z' l- V# j% W/ A( b
double YiZhenShuJu[800];
( _5 r* l0 b/ `8 H double dv1[800]; R* F2 X' r8 ]. u
3 R. T9 k h+ g) `9 u5 ]9 Y, Q( Y' R+ S- f& W
double b_YiZhenShuJu[800]; W, q) f7 h1 t6 p/ ^8 v- p u! n
double I_filtfilt[800];
2 f0 w7 Z, }: C% A: Y: j4 o double Q_filtfilt[800];
" p+ l7 T3 Q; ?& Y7 {3 h" z2 l creal_T b_I_filtfilt[800];
5 `4 ^1 h; G/ P5 y# r* W- n creal_T b[800];4 e' f' Y: ~" U) }5 o( A0 M
creal_T RCRxSignal[50];
" J3 x4 ]9 r$ ~ P9 f F creal_T fineCompSignal[50];
" \6 {( Q2 ~$ z$ m2 k double phError[50];7 x5 f t5 W/ W1 e0 t {: z* M' d
creal_T timingRecSignal_data[28];
% z: I: n1 a* W& g int timingRecSignal_size[1];2 A9 i: y7 V8 l+ F+ m( L1 M8 y
double prbIdx_data[28];
) F) P' |1 X7 ?* G/ F int prbIdx_size[1];
4 k2 M# L$ s( h( r double dtMt_data[28];
& N! q1 X% r# \' @2 f3 m0 Z int dtMt_size[1];) g5 ^# l7 D% l5 Q% h8 M( R
creal_T symFrame[25];
- r1 L) s# ~! g& Q' G- w boolean_T isFrameValid;
9 @' o- ]" m: E d+ _ double unusedU0[3];. C/ h( Q3 e6 h5 O
2 O$ \6 C. u! p, X //调试过程中的变量9 B2 M; I* e( }' |
int enough_data;
7 T% [ Q4 ^# `8 X$ ~2 r% y2 {
1 ? s; u" ~8 e6 d: Y int enoughDataFlag; i8 J: f: T; U* Z5 G
int yiDuanShuJu_mean_int;
7 w2 H0 m' V8 a$ Q3 _% a; _) X; G int int_sum_dv0;
4 d% Q* e+ F4 |5 p int oo;
X$ x( h8 Q1 K0 _4 A int ii;. } [* N& I7 G' v+ C
myfuck=10;
- o; L/ }# Z$ e /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */6 ` `, W1 _0 Y% |1 W# _* J7 G
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */5 p9 O8 j. w. _9 {% v5 a/ I
a! ^& {, \* C9 y ?; B
yiDuanShuJu_mean = mean(data1000);
' r8 l; `% B$ k9 {3 W% n2 Q2 x4 ]' C+ Z, q1 Z i; x! M# l
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
) x0 m7 `' o: Q- }) M1 _ UARTPutc('A');; C$ F) ^! e0 F' O: v
UARTPutNum(yiDuanShuJu_mean_int);
" p3 d7 k; @' u2 A& k3 _% e UARTPutc('\r');
, f. {/ i) s8 Z- _6 R3 o; q8 w UARTPutc('\n');) S9 O6 @1 I8 f0 F6 k" k
6 [2 A/ v$ |$ k2 k, i
for (ixstart = 0; ixstart < 1000; ixstart++) {
/ o' i5 ] m0 R3 ?) |# L3 c yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;$ F0 C8 ]7 N- R8 W; \
}
2 H3 s. f6 R8 F% h) ^5 }
. ?# Y3 L+ h- x z ^ power(yiDuanShuJu_LowMean, dv0);7 X' Q, Z/ k" r
6 }0 R D) S+ X2 e; h* C int_sum_dv0 = (int) sum(dv0);: w: u' o- h9 h
4 Q! x. O2 q8 p# S UARTPutc('B');
' a' R& i% U' x; n7 O% K6 x4 m UARTPutNum(int_sum_dv0);. k/ J. Y9 o4 G( Q! T. O
UARTPutc('\r');. V0 \% U7 y. R/ F9 n# X4 E9 g
UARTPutc('\n');, N' K. i6 ]# i4 c
5 M- u- p- L" R6 B( \' j F// int compareFlag = int_sum_dv0 > 1.0E+8;* ^9 z7 w9 v# q1 U3 l( i0 ?% e: u9 f
; e4 T N5 w* B
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
4 Q+ B; g, s' M6 p UARTPutc('C');4 ^$ P1 v- @1 D7 p
/* 比较信号能量 */
# ^8 l T# P+ V2 H1 M% J* u /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
; g' y* a% C0 g* K, K// yiDuanShuJu_mean = 1000.0 * youxiao_k;
, T: [) F. C7 G9 p" q a0 R// for (ixstart = 0; ixstart < 1000; ixstart++) {3 V2 Q& [( }0 Y9 E6 \( B
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
0 v3 Z o Y: P: O" @# G, ^$ W// yiDuanShuJu_LowMean[ixstart];
5 ^/ N' M5 Q8 m$ s; n7 P// }
; D' y0 [8 [' i4 ?: V. `. D//
8 u; T/ Q' |& P; x, g( v, Y4 }// youxiao_k++;! }: T% Z- Y& W* g) ~
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==1 {$ T4 R, l5 X# n S8 E p
// /* 感觉要取21个数,即0-20, */
- n; t* M! j; E) J// enough_data = 10;//有效是10,无效是0* T# a7 F/ v4 K. v" Y8 C0 @
// }
, F( S" c2 w0 E4 o- g4 U }1 E7 _; D0 Q$ a! f: t+ K( c4 w: }
+ X9 `% v8 v# q" ~3 i) a
' a/ s/ a, ]' N8 Y& ?) s; \6 c
enoughDataFlag = 100;/ v/ H8 d0 d {3 k$ H1 I
enoughDataFlag = 1000;' `2 j# q2 o& ?
enoughDataFlag = 0x02;* g9 A L, G! c" y6 n4 W4 D
enoughDataFlag = 200;
2 i4 w, ^" `0 E- x9 o, w5 d" V" l
' J E7 [* O5 v+ A7 u: U int myfuvk1;
' n! D; W7 {: i& ?8 s myfuvk1 =11;
2 v1 ]1 I' _! k; |$ O9 _5 z
- B' P1 P8 a" k2 Y$ R' L5 e% _$ d/ g+ [: b* x- E5 x8 z5 |
enough_data = 0;; [ Y, s: o" ~9 l
. u/ |9 h" A# d& R/ o A
// if(enough_data>50){
2 B( x N/ F- B: |// enoughDataFlag=0x01;
+ S9 p1 H2 {# z3 G8 P+ Q. E' w// }else if(enough_data<50){
( Q! P4 ^ b$ ^" w// enoughDataFlag=0x00;//0x00还是不行
$ `2 }8 N/ R) t+ @ H$ z// }
/ {# J6 _ h0 {# _
( _; I7 ~6 |+ Q. [; r: T6 b% V h/ D
3 `* B7 k# u i9 n' ? oo=10;& l% n( }* F3 v& z1 |7 F4 Z+ M
oo = oo < 5;, G+ e* n# ?3 i4 f" k' b
if(oo){# f; q! f( E t) T5 `. I4 b* S
ii=0;
' O# }( a, i; N6 \3 {& X5 } }/ V0 D4 b( R: m) R
if(oo < 5){
( D! C! x$ S( ` J7 f3 T2 Y ii=0;
% y! b, q% x2 u& E/ G0 @. ^ }3 y( i4 H( p8 t1 i
if(oo > 5){5 r h1 [, [2 G) l! \
ii=0;& t; l& ]8 M. [$ P u' {
}
9 p7 ?3 @2 K t8 o3 L( b
- ]- F- S* t9 F2 c$ S1 a T /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
; e) z- S4 D2 A5 M9 o8 y /* 如果数据足够才执行主程序 */
7 A$ T$ p+ K3 D6 ^' O0 ^/ V( e oo = oo < 5;, i4 |4 q ^# ?# Z) M
enoughDataFlag = enoughDataFlag < 5;
$ T( V% `. |# B/ p3 v/ t if (enoughDataFlag < 5) {
/ I/ R, R9 K* v1 s1 ]+ o// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
# [6 }) P- n; ?& F AGC_AGC(&pAGC);
* c: y/ ~. v$ s% S, o! Q0 H7 p! u* `
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);! k d( {4 a' X+ G6 ~3 T: m5 e
FIRDecimator_FIRDecimator(&pRxFilter);& h; e! ?' ^- \7 a1 r% v
& E9 k4 c' v8 c5 _ /* Downsampling */
/ [5 B" c- e$ s2 c c_SymbolSynchronizer_SymbolSync(&pTimingRec);
( m! s1 B! f g
$ x$ y& G/ C: u' z c_PreambleDetector_PreambleDete(&pPrbDet);
8 ^: x, d. j7 O; s. W
9 F8 g" s: s$ ~) k$ L /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
9 X0 _* w9 i& @/ i /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
, i. t$ Z' d0 i6 K /* %帧数量=100 */ {& \' d( [: g
pFrameSync.isInitialized = 0;9 _; k! V& ]7 x
" I0 L. s& A+ l& A6 O% Q /* [EOF] */' q# O+ c. [' ^* x8 A$ `) m7 D
/* 前导码长度是13 */
# L2 U& I' ]- a5 R+ k9 U /* %qpsk */
, g. b7 l, K! z8 A( K+ } pDataDecod.isInitialized = 0;3 C9 B6 D2 d5 }0 {( s7 r
4 x+ Y; q7 k4 N! J
/* end */
6 X& A+ P6 {4 }9 B3 d /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
8 Q5 A! t* r, h' D6 F4 h I /* Convert 3-dB frequency */
; W/ p0 L' t$ e) z2 g9 m /* Convert 3-dB frequency */6 Y: ?# v5 o# f8 Y8 z
filtfilt(save_buffer, usable_left_filtfilt);
* I; C/ s& E0 T5 J z V& { for (ixstart = 0; ixstart < 81000; ixstart++) {4 U0 Y& M7 F' j% o
usable_left_filtfilt[ixstart] *= 2.0;
1 ^, z) ?% W' d* W2 a* q }7 ?3 M4 d$ \8 z; o7 r- S0 ^
! i" A% w: I4 P
/* 注意乘2,处理幅度 *// T+ E& M6 j* S" H# l5 t+ A6 M
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
% X6 _ r. {6 C; w5 A /* %% 行列转换 */
5 i, e- G8 N z+ F7 B# q; t& A yiDuanShuJu_mean = b_mean(usable_left_filtfilt);3 I" C0 l4 B5 Z& L
for (ixstart = 0; ixstart < 81000; ixstart++) {
) q6 m5 Z; i7 M; j5 }. J youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]6 u/ _) M6 d8 s0 R
- yiDuanShuJu_mean;
$ F$ _9 T8 y7 b+ n+ Z. Q }9 M8 \! @; T* l- K
# u0 F% G- h1 N; R$ D; g! c /* %% 应该对数据归一化,但是这一步放在哪比较好 */
. a6 r+ K# m3 y u( ` ixstart = 1;
5 y9 P0 U( p$ O5 g/ z' h mtmp = youXiaoShuJu_QuZhiLiu[0];2 k$ o0 L+ `% a( H& {0 j% k% g
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
6 e3 h. t% Z( c- O' h A ix = 2;
; X3 ?' x" A! T* S8 x0 i; Q" K exitg2 = false;1 z) |% H5 Z% x; F
while ((!exitg2) && (ix < 81001)) {
5 x! Y( j# e: m: t; ^" _" F ixstart = ix;
1 V$ c. M/ b) v, v7 S6 { if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* j4 ]& ]3 D8 \' d mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];1 p' q6 W: W$ M' m8 `
exitg2 = true;0 d, T0 B3 M! \" r7 m4 @
} else {$ l7 l8 V# p0 @7 P4 y
ix++;
' _+ F4 ^9 a7 y* P }; o; A/ S' } f: w" r7 s
}. I' H% c* u: U0 M9 O
}. Q6 S, y7 Q, n, }
) A. j6 t. f% F# n/ ]7 j if (ixstart < 81000) {& q0 T8 ~. x& w8 l% X( e( E
while (ixstart + 1 < 81001) {
$ S6 F( t) |& M, e$ T) F g4 B if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {+ r+ E- ~8 ], y, q. j1 W8 Z
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];: {# o- U. L. h2 O9 A
}% Z) f5 n$ |/ m3 S8 @( o- U% z
' \; \, u: O/ y* k8 I z6 u r% W
ixstart++;
3 z. }9 s0 G7 A3 ^4 t }3 G+ {; F; v3 k4 J% d6 o
}
! D% ?' H" j- V/ a1 s! z6 n
/ x1 ]) G) i( Q5 s0 P7 x ixstart = 1;. K2 Q0 _( s$ @
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];8 g1 Z: z7 O" H! n
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
7 v. j- Z* L O2 G) }( f) W3 s* m ix = 2;, r; l4 P9 m9 z# N
exitg1 = false;( E1 {) S1 ]9 T- t
while ((!exitg1) && (ix < 81001)) {
" D" w1 Z2 d1 k" D! K% y ixstart = ix;# B" g3 c! V' X. N+ g5 z7 B
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {- n1 D; ~) U T
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];' i+ b; g+ f. [% c# o" r
exitg1 = true;2 C0 d$ r* v6 J2 X' r
} else {
# h* }7 M' o, y1 b+ Z; Z ix++;' J" c" N/ q; L7 g% V
}- @* r3 H: J% }, I
}3 c" T* ?( ?9 U: Y0 E# C% g
}% H, K# k$ x# m" ~
" O* F3 K$ x- n1 C9 p- U# q if (ixstart < 81000) {
2 L4 }4 c, l; P+ Y* { while (ixstart + 1 < 81001) {5 i7 P" r( h) L0 j7 q
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
) u! @3 `, h) N! `+ @8 ]4 d$ _ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
' U4 ?2 w: K6 ~# O, ^% b }0 b3 z% W0 y* \8 [/ n
- k" {3 m8 y1 x; O; ^; D
ixstart++;
# g( N6 Y! A, B. t/ h }+ d( I+ ]" D" F3 H, C4 u* |7 p
}- L* ? x$ q2 p1 B/ z& x6 l
. |% Z, [' z- u0 X yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
' g; N+ f. u1 b$ R5 T3 u if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {8 B8 x- M( r+ B$ u7 c
yiDuanShuJu_mean = mtmp;
1 K$ Z' d, g8 s/ n3 [ }
" P2 o0 x- q1 x& ?' R7 z2 R2 F
% V( p" O7 m2 T3 O /* 找出极值 */) x4 g) o& }/ M% l
for (ixstart = 0; ixstart < 81000; ixstart++) {: |! U1 Y1 T& S8 t: g8 D
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;' q( i( }$ G5 _) u W$ U
}
# a3 S1 L9 m! q/ j u P. s, ]6 V$ i/ @
--------------帖子字数限制------------------
% W/ m+ r/ O7 Y2 @3 P: \0 k& `}2 `- s: R( p0 h- \2 g4 w1 _
) |0 H2 {! Z/ p4 }2 |
8 V6 ^$ g( b6 `! {3 p+ U/ S q9 O" Y' q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|