@@ -284,25 +284,27 @@ Spectrum<T> dedispered_fil_with_dm(
284284 throw std::invalid_argument (" Time window too short for this DM and band (no valid samples after dedispersion)." );
285285 }
286286
287- // ---- RFI:只在“局部输入切片”上运行(长度 = t_len_eff + delay_max_idx) ----
288- // 这样解色散访问到的所有原始样本都被一致地标注/掩膜。
287+ // ---- RFI:只在“局部输入切片”上运行 ----
288+ // 扩展窗口以覆盖解色散所需的所有样本
289289 T* origin_data = static_cast <T*>(fil->data );
290- const size_t slice_len_for_rfi = t_len_eff + (size_t )delay_max_idx;
291- T* slice_ptr = origin_data + t_start_idx * fil->nchans ;
290+ size_t rfi_t_start_idx = (t_start_idx > (size_t )delay_max_idx) ? (t_start_idx - delay_max_idx) : 0 ;
291+ size_t rfi_offset_from_t_start = t_start_idx - rfi_t_start_idx;
292+ T* slice_ptr_for_rfi = origin_data + rfi_t_start_idx * fil->nchans ;
293+ size_t slice_len_for_rfi = std::min (t_len_eff + rfi_offset_from_t_start + 2 * delay_max_idx, (size_t )fil->ndata - rfi_t_start_idx);
292294
293295 RfiMarkerCPU<T> rfi_marker (maskfile);
294296 if (rficfg.use_iqrm ) {
295297 auto win_masks = iqrm_cuda::rfi_iqrm_gpu_host<T>(
296- slice_ptr , // 指向局部起点
298+ slice_ptr_for_rfi , // 指向扩展切片的起点
297299 chan_start, chan_end_excl,
298300 slice_len_for_rfi, // 覆盖局部 + 最大延时
299301 fil->nchans ,
300302 fil->tsamp , rficfg);
301- rfi_marker.mask (slice_ptr , fil->nchans , slice_len_for_rfi, win_masks);
303+ rfi_marker.mask (slice_ptr_for_rfi , fil->nchans , slice_len_for_rfi, win_masks);
302304 }
303305 if (rficfg.use_mask ) {
304- // 静态掩膜同样只作用在切片上(不必动全局)
305- rfi_marker.mark_rfi (slice_ptr , fil->nchans , slice_len_for_rfi);
306+ // 静态掩膜同样只作用在扩展切片上
307+ rfi_marker.mark_rfi (slice_ptr_for_rfi , fil->nchans , slice_len_for_rfi);
306308 }
307309
308310 // ---- 输出光谱 ----
@@ -326,10 +328,9 @@ Spectrum<T> dedispered_fil_with_dm(
326328#pragma omp simd
327329 for (ptrdiff_t ch = (ptrdiff_t )chan_start; ch < (ptrdiff_t )chan_end_excl; ++ch) {
328330 const int d = dm_delays[ch - chan_start];
329- const size_t src_idx = (size_t )ti + (size_t )d; // 相对于 slice_ptr 的偏移
330- // 由 t_len_eff 的定义,src_idx < slice_len_for_rfi 恒成立,无需额外边界判断
331+ const size_t src_idx = t_start_idx + (size_t )ti + (size_t )d; // 相对于 origin_data 的绝对偏移
331332 result.data [(size_t )ti * (size_t )result.nchans + (size_t )(ch - chan_start)]
332- = slice_ptr [src_idx * fil->nchans + (size_t )ch];
333+ = origin_data [src_idx * fil->nchans + (size_t )ch];
333334 }
334335 }
335336
@@ -420,20 +421,23 @@ Spectrum<T> dedisperse_spec_with_dm(
420421 }
421422
422423 // ---- RFI(局部+最大延时)----
423- T* slice_ptr = spec + t_start_idx * header.nchans ;
424- size_t slice_len_for_rfi = t_len_eff + (size_t )delay_max_idx;
424+ size_t rfi_t_start_idx = (t_start_idx > (size_t )delay_max_idx) ? (t_start_idx - delay_max_idx) : 0 ;
425+ size_t rfi_offset_from_t_start = t_start_idx - rfi_t_start_idx;
426+ T* slice_ptr_for_rfi = spec + rfi_t_start_idx * header.nchans ;
427+ size_t slice_len_for_rfi = std::min (t_len_eff + rfi_offset_from_t_start + 2 * delay_max_idx, header.ndata - rfi_t_start_idx);
428+
425429 RfiMarkerCPU<T> rfi_marker (maskfile);
426430 if (rficfg.use_iqrm ) {
427431 auto win_masks = iqrm_cuda::rfi_iqrm_gpu_host<T>(
428- slice_ptr ,
432+ slice_ptr_for_rfi ,
429433 chan_start, chan_end_excl,
430434 slice_len_for_rfi,
431435 header.nchans ,
432436 header.tsamp , rficfg);
433- rfi_marker.mask (slice_ptr , header.nchans , slice_len_for_rfi, win_masks);
437+ rfi_marker.mask (slice_ptr_for_rfi , header.nchans , slice_len_for_rfi, win_masks);
434438 }
435439 if (rficfg.use_mask ) {
436- rfi_marker.mark_rfi (slice_ptr , header.nchans , slice_len_for_rfi);
440+ rfi_marker.mark_rfi (slice_ptr_for_rfi , header.nchans , slice_len_for_rfi);
437441 }
438442
439443 // ---- 构造输出 ----
@@ -457,9 +461,9 @@ Spectrum<T> dedisperse_spec_with_dm(
457461#pragma omp simd
458462 for (ptrdiff_t ch = (ptrdiff_t )chan_start; ch < (ptrdiff_t )chan_end_excl; ++ch) {
459463 int d = dm_delays[ch - chan_start];
460- size_t src_idx = (size_t )ti + (size_t )d; // 相对于 slice_ptr
464+ size_t src_idx = t_start_idx + (size_t )ti + (size_t )d; // 相对于 spec
461465 result.data [(size_t )ti * result.nchans + (size_t )(ch - chan_start)]
462- = slice_ptr [src_idx * header.nchans + (size_t )ch];
466+ = spec [src_idx * header.nchans + (size_t )ch];
463467 }
464468 }
465469
0 commit comments