tf.segment_sum 分段计算函数

本文主要介绍了tf.segment_sum和tf.unsorted_segment_sum函数。tf.segment_sum对输入数据分割并按对应下标求和,segment_ids值为对data第一维度索引。tf.unsorted_segment_sum计算张量片段的和,segment_ids无需排序,若分段ID和为空,output[i]=0,负值会被删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tf.segment_sum

定义

tf.segment_sum(
    data,
    segment_ids,
    name=None
)

Computes the sum along segments of a tensor.
对输入数据data进行分割,并按对应下标进行求和。

输入数据

data为待分割数据
segment_ids为分割下标。segment_ids的大小应与data的第一个维度长度(k)相同。且segment_ids的值应小于k。
name是该操作命名。

详解

Computes a tensor such that (output_i = \sum_j data_j) where sum is over j such that segment_ids[j] == i.
If the sum is empty for a given segment ID i, output[i] = 0.
segment_ids中的值相当于对data数据第一维度的索引。输出数据的第一个维度(output[0])为segment_ids==0的下标所对应的data的数据的求和。

示例

data = [5 1 7 2 3 4 1 3]
segment_ids = [0 2 4 1 5 2 4 1]
output = tf.segment_sum(
    data,
    segment_ids,
    name=None
)
  • segment_ids的大小与data第一维度相同。(=8)且segment_ids的每个值<8。
  • output[0] = data[segment_ids==0] = 5
  • output[2] = data[segment_ids==2] = 1+4 = 5
  • 对于segment_ids没有指定的下标(output[3])直接等于0,output[3]=0

 

tf.unsorted_segment_sum函数

tf.unsorted_segment_sum(
    data,
    segment_ids,
    num_segments,
    name=None
)

计算张量片段的和. 

计算一个张量,使得 (output[i] = sum_{j...} data[j...] 总和超过元组 j...,例如,segment_ids[j...] == i.与 SegmentSum 不同,segment_ids 不需要排序,不需要覆盖整个有效值范围内的所有值.

如果给定段 ID i 的和为空,则 output[i] = 0.如果给定的分段 ID i 为负值,则该值将被删除并且不会被添加到该段的总和中.

num_segments 应等于不同的段 ID 的数量.

TensorFlow函数

函数参数:

  • data:一个 Tensor,必须是下列类型之一:float32,float64,int32,uint8,int16,int8,complex64,int64,qint8,quint8,qint32,bfloat16,uint16,complex128,half,uint32,uint64.
  • segment_ids:一个 Tensor,必须是以下类型之一:int32,int64,张量的形状是一个 data.shape 的前缀.
  • num_segments:一个 Tensor,必须是以下类型之一:int32,int64.
  • name:操作的名称(可选).

函数返回值:

tf.unsorted_segment_sum函数返回一个 Tensor,它与 data 的类型相同.

现在已有两个函数如下: %% 修改后的 generate_tf_waterfall 函数 function [composite_signal, t_total, Fs] = generate_tf_waterfall(grayImg, f1, f2, t1, t2) % 参数验证 if nargin < 5 error('需要5个输入参数'); end if f1 >= f2 error('f1 必须小于 f2'); end if t1 >= t2 error('t1 必须小于 t2'); end if ~ismatrix(grayImg) || ~isnumeric(grayImg) error('grayImg 必须是二维数值数组'); end if any(grayImg(:) > 1 | grayImg(:) < 0) warning('二值图像应在[0,1]范围内,自动二值化处理'); grayImg = grayImg > 0.5; end % === 关键修改1: 自适应采样率 === k = 2.5; % 采样率倍数 (满足 Nyquist 定律) Fs = max(1000, k * f2); % 确保最低采样率1000Hz且Fs > 2*f2 if Fs <= 2*f2 Fs = 2.1 * f2; % 强制满足 Nyquist warning('调整Fs=%.1fHz以满足Nyquist要求', Fs); end % 获取图像尺寸 [M, N] = size(grayImg); total_duration = t2 - t1; % 计算时间步长 delta_t = total_duration / max(N, 1); % 避免除零 % 创建总时间向量 t_total = linspace(t1, t2, ceil(total_duration * Fs)); composite_signal = zeros(1, numel(t_total)); % 预计算频率映射 freq_bins = linspace(f2, f1, M+1); % 顶部行=高频, 底部行=低频 % 处理每个时间列 for j = 1:N % 当前时间区间 t_start_pixel = t1 + (j-1) * delta_t; t_end_pixel = t1 + j * delta_t; non_zero_rows = find(grayImg(:, j)); for k = 1:numel(non_zero_rows) row_idx = non_zero_rows(k); % 计算频率范围 if row_idx < M f_low = freq_bins(row_idx + 1); f_high = freq_bins(row_idx); else f_low = freq_bins(end-1); f_high = freq_bins(end); end % 频率边界保护 f_low = max(f1, min(f2, f_low)); f_high = max(f1, min(f2, f_high)); if f_low >= f_high f_high = f_low + 0.1*(f2-f1); % 最小带宽保护 end % === 关键修改2: 传递Fs参数 === [pixel_signal, t_pixel] = generate_tf_rectangle(... t_start_pixel, t_end_pixel, f_low, f_high, Fs); % 传入Fs if isempty(pixel_signal) continue; end % 对齐时间向量并叠加信号 idx_start = find(t_total >= t_pixel(1), 1); if isempty(idx_start), idx_start = 1; end idx_end = find(t_total <= t_pixel(end), 1, 'last'); if isempty(idx_end), idx_end = numel(t_total); end valid_idx = idx_start:min(idx_end, numel(composite_signal)); sig_len = length(pixel_signal); valid_len = length(valid_idx); if valid_len > 0 if sig_len > valid_len composite_signal(valid_idx) = composite_signal(valid_idx) + ... pixel_signal(1:valid_len); else composite_signal(valid_idx(1:sig_len)) = ... composite_signal(valid_idx(1:sig_len)) + pixel_signal; end end end % 进度显示 if mod(j, 10) == 0 fprintf('处理进度: %d/%d 列 (%.1f%%)\n', j, N, j/N*100); end end % 归一化信号 if ~isempty(composite_signal) composite_signal = composite_signal / max(abs(composite_signal)); end % 可视化 if nargout == 0 || ~isempty(composite_signal) visualize_spectrogram(composite_signal, Fs, grayImg, f1, f2, t1, t2); end end %% 修改后的 generate_tf_rectangle 函数 function [signal, t] = generate_tf_rectangle(t_start, t_end, f_low, f_high, Fs) % 参数验证 if nargin < 5 error('需要5个输入参数'); end if t_start >= t_end error('t_start 必须小于 t_end'); end if f_low >= f_high error('f_low 必须小于 f_high'); end % === 关键修改3: 动态Nyquist校验 === nyquist = Fs/2; if f_high > nyquist f_high = min(nyquist * 0.95, f_high); % 强制低于Nyquist频率 f_low = min(f_high - 1, f_low); % 保持最小带宽 warning('频率(%.1f-%.1fHz)超出Nyquist(%.1fHz), 已调整', ... f_low, f_high, nyquist); end min_samples = 36; % filtfilt要求的最小样本数 buffer_time = 0.1; % 前后缓冲时间(秒) % 计算原始时间区间长度 orig_duration = t_end - t_start; orig_samples = ceil(orig_duration * Fs); % === 关键修改4: 优化时间向量范围 === start_time = max(0, t_start - buffer_time); end_time = t_end + buffer_time; t = start_time:1/Fs:end_time; signal = zeros(size(t)); % 找到有效时间区间 idx_start = find(t >= t_start, 1); if isempty(idx_start), idx_start = 1; end idx_end = find(t <= t_end, 1, 'last'); if isempty(idx_end), idx_end = length(t); end valid_idx = idx_start:idx_end; segment_length = length(valid_idx); % 处理极短时间区间 if segment_length < min_samples if segment_length > 10 center_freq = (f_low + f_high)/2; [signal_seg, t_seg] = generate_single_tone(t_start, t_end, center_freq, Fs); else [signal_seg, t_seg] = generate_impulse((t_start+t_end)/2, f_low, f_high, Fs); end % 将短信号放入对应区间 [~, pos] = min(abs(t - t_seg(1))); valid_pos = pos:min(pos+length(signal_seg)-1, length(signal)); signal(valid_pos) = signal_seg(1:length(valid_pos)); return; end % 生成高斯白噪声 noise = randn(1, segment_length); % 设计带通滤波器 Wn = [f_low, f_high] / (Fs/2); if any(Wn >= 1) Wn = min(0.99, Wn); % 防止归一化频率≥1 end % 动态确定滤波器阶数 max_order = floor((segment_length-1)/3); filter_order = min(max(1, max_order), 12); % 阶数限制在1-12 % 尝试filtfilt try [b, a] = butter(filter_order, Wn, 'bandpass'); filtered_noise = filtfilt(b, a, noise); catch try b = fir1(filter_order*4, Wn, 'bandpass'); filtered_noise = filtfilt(b, 1, noise); catch filtered_noise = freq_domain_filter(noise, Fs, f_low, f_high); end end % 应用渐变窗 fade_samples = min(50, floor(segment_length/10)); if fade_samples > 2 fade_in = linspace(0, 1, fade_samples); fade_out = linspace(1, 0, fade_samples); filtered_noise(1:fade_samples) = filtered_noise(1:fade_samples) .* fade_in; filtered_noise(end-fade_samples+1:end) = filtered_noise(end-fade_samples+1:end) .* fade_out; end % 放入信号 signal(valid_idx) = filtered_noise; % 归一化 if max(abs(signal)) > 0 signal = signal / max(abs(signal)); end end %% 辅助函数:生成单频信号 function [signal, t] = generate_single_tone(t_start, t_end, freq, Fs) duration = t_end - t_start; t = t_start:1/Fs:t_end; signal = sin(2*pi*freq*t); % 应用渐变窗 fade_samples = min(100, floor(length(signal)/4)); if fade_samples > 2 fade_in = linspace(0, 1, fade_samples); fade_out = linspace(1, 0, fade_samples); signal(1:fade_samples) = signal(1:fade_samples) .* fade_in; signal(end-fade_samples+1:end) = signal(end-fade_samples+1:end) .* fade_out; end end %% 辅助函数:生成脉冲信号 function [signal, t] = generate_impulse(t_center, f_low, f_high, Fs) % 生成带限脉冲 center_freq = (f_low + f_high)/2; bandwidth = f_high - f_low; % 脉冲持续时间 (反比于带宽) pulse_duration = min(0.1, 2/bandwidth); t_start = t_center - pulse_duration/2; t_end = t_center + pulse_duration/2; t = t_start:1/Fs:t_end; % 创建带限脉冲 pulse = sin(2*pi*center_freq*t) .* gausswin(length(t))'; % 归一化 signal = pulse / max(abs(pulse)); end %% 辅助函数:频域滤波 function filtered = freq_domain_filter(signal, Fs, f_low, f_high) N = length(signal); freq = (0:N-1)*(Fs/N); % 创建频域滤波器 H = ones(1, N); low_idx = floor(f_low/(Fs/N)) + 1; high_idx = ceil(f_high/(Fs/N)) + 1; % 设置带通范围 H(1:low_idx) = 0; H(high_idx:end) = 0; H(N-high_idx+2:N) = 0; % 处理负频率部分 H(N-low_idx+2:N) = 0; % 应用频域滤波 spectrum = fft(signal); filtered_spectrum = spectrum .* H; filtered = real(ifft(filtered_spectrum)); % 确保实信号 if isreal(signal) filtered = real(filtered); end end %% 修复后的可视化子函数 (完全兼容MATLAB 2019a) function visualize_spectrogram(signal, Fs, grayImg, f1, f2, t1, t2) fig = figure('Color', 'white', 'Position', [100, 100, 900, 700]); try % 时频分析参数 window = hamming(256); noverlap = 200; nfft = 1024; % 计算时频谱 [s, freq, time] = spectrogram(signal, window, noverlap, nfft, Fs, 'yaxis'); % === 修复1: 正确获取waterfall对象句柄 === subplot(211) h_waterfall = waterfall(time, freq, 10*log10(abs(s))); % === 修复2: 设置曲面属性而非坐标轴属性 === set(h_waterfall, 'EdgeColor', 'interp', 'LineWidth', 0.5); view([30, 60]) title('时频域瀑布图 (基于二值图像生成)') xlabel('时间 (s)'), ylabel('频率 (Hz)'), zlabel('幅度 (dB)') colormap jet colorbar grid on ylim([f1, f2]) zlim([-50, 0]) % === 修复3: 兼容性图像显示 === subplot(212) % 计算图像显示位置 time_vec = linspace(t1, t2, size(grayImg, 2)); freq_vec = linspace(f1, f2, size(grayImg, 1)); % 使用imagesc代替image确保兼容性 imagesc(time_vec, freq_vec, grayImg); set(gca, 'YDir', 'normal') title('输入的二值时频结构') xlabel('时间 (s)'), ylabel('频率 (Hz)') colormap(gca, gray(256)) % 明确指定灰度图 colorbar axis tight sgtitle(sprintf('时频结构可视化: %.1f-%.1fHz, %.1f-%.1fs', f1, f2, t1, t2), 'FontSize', 14) catch ME warning('可视化失败: %s', ME.message); % 备用绘图方案 subplot(211) plot((0:length(signal)-1)/Fs, signal); title('生成的时域信号'); xlabel('时间 (s)'), ylabel('幅度'); grid on; subplot(212) imagesc(grayImg); title('输入的二值时频结构'); colormap gray; colorbar; end end 请根据用户需求修改生成新的函数,generate_tf_waterfall中引入一个新的变量n,其功能如下: 变量n表示将信号在频域上切分为均等的n段,每一段由一个独立的信号源实现切分后的瀑布图效果,返回值composite_signal修改为一个2维数组,表示每个信号源输出的时域信号,visualize_spectrogram中绘制的瀑布图应为各信号源信号合成后的瀑布图
最新发布
06-27
<think>我们引入变量n,将频带[f1,f2]均分为n段,每段对应一个独立的信号源。修改点:1.函数输入参数中添加n,并验证n为正整数且n>=1。2.将频带划分为n个区间:f_bands=linspace(f1,f2,n+1);那么第i个频带为[f_bands(i),f_bands(i+1)],i=1,2,...,n。3.修改composite_signal为一个n行的矩阵,每一行对应一个信号源(即一个频带)的时域信号。4.在循环处理每个像素列时,根据当前像素行对应的频率属于哪个频带,将生成的信号加到对应的信号源行上。5.最后,每个信号源分别归一化(注意:归一化是在每个信号源上独立进行,因为不同频带信号幅度可能不同)。6.在可视化部分,我们首先将各信号源信号相加(即叠加)得到总信号,然后对总信号进行时频分析并绘制瀑布图。同时,我们还可以绘制每个信号源的时频谱(可选,但题目要求瀑布图为合成后的,所以主要绘制合成后的瀑布图)。步骤详细说明:-参数验证:检查n是否为正整数,若未提供则默认为1(即不分段)。-划分频带:f_bands=linspace(f1,f2,n+1);-初始化composite_signal为n行,每行长度为总时间点数(即numel(t_total))的零矩阵。-对于图像中的每一列j,以及该列中的每个非零像素行row_idx,计算该像素对应的频率范围(f_low,f_high):row_idx对应的频率区间为[freq_bins(row_idx+1),freq_bins(row_idx)](注意:freq_bins是从f2到f1递减的,因为图像顶部行对应高频f2,底部行对应低频f1)-然后判断这个频率区间属于哪个频带(即属于哪个信号源)。注意:一个像素的频率区间可能跨越多个频带,但为了简化,我们只取该像素的中心频率所在的频带。或者,如果该像素的频率区间与某个频带有重叠,我们可以将其分配到重叠部分最大的那个频带。但为了简单,我们采用中心频率:center_freq=(f_low+f_high)/2;然后找到center_freq所在的频带区间:即满足f_bands(i)<=center_freq<=f_bands(i+1)的i。如果中心频率在多个频带边界上,取第一个满足条件的频带(实际上由于均分,不会重叠,所以直接判断即可)。-将生成的像素信号加到对应的信号源行上(注意时间对齐)。-循环结束后,对每个信号源(即composite_signal的每一行)进行归一化(除以该行的最大值)。-在可视化函数visualize_spectrogram中,我们需要修改为首先将各信号源信号相加得到总信号,然后对总信号进行时频分析绘制瀑布图。同时,我们也可以考虑绘制每个信号源的时频谱(作为子图),但根据题目要求,瀑布图应为合成后的,所以我们主要绘制合成后的瀑布图。另外,原可视化函数中还有输入的二值图像显示,我们保留。修改后的函数头:function[composite_signal,t_total,Fs]=generate_tf_waterfall(grayImg,f1,f2,t1,t2,n)注意:如果用户不提供n,则我们可以设置默认值(例如n=1)。但原函数调用是5个参数,所以需要处理输入参数个数。因此,修改参数验证部分:ifnargin<6n=1;%默认不分段endifn<1||fix(n)~=nerror('n必须为正整数');end另外,在函数内部,划分频带:f_bands=linspace(f1,f2,n+1);%共n+1个点,划分成n个区间然后,初始化composite_signal:composite_signal=zeros(n,numel(t_total));%n行,每行一个信号源在循环中,对于每个像素信号,我们确定其中心频率所在的频带索引:center_freq=(f_low+f_high)/2;band_index=find(center_freq>=f_bands(1:end-1)&center_freq<=f_bands(2:end),1);注意:由于f_bands是递增的,所以这样判断。如果找不到,则说明中心频率不在任何频带内(理论上不会,因为f_bands覆盖了f1到f2),我们可以将其分配到最近的频带,或者忽略。这里我们使用find找到第一个满足条件的频带索引。然后,将生成的pixel_signal加到composite_signal的第band_index行对应的位置(注意时间对齐)。归一化部分:对每一行分别归一化fori=1:nifmax(abs(composite_signal(i,:)))>0composite_signal(i,:)=composite_signal(i,:)/max(abs(composite_signal(i,:)));endend修改可视化函数:在visualize_spectrogram中,我们原本传入的是总信号(即所有信号叠加)。现在我们需要将各信号源信号叠加起来得到总信号,然后再进行时频分析。total_signal=sum(composite_signal,1);%按行求和,得到总信号然后调用spectrogram时使用total_signal。注意:原visualize_spectrogram函数有6个参数:signal,Fs,grayImg,f1,f2,t1,t2。现在我们在generate_tf_waterfall中调用visualize_spectrogram时,传入的应该是总信号total_signal。因此,在generate_tf_waterfall函数的最后,调用可视化函数的部分改为:ifnargout==0||~isempty(composite_signal)total_signal=sum(composite_signal,1);visualize_spectrogram(total_signal,Fs,grayImg,f1,f2,t1,t2);end另外,我们也可以考虑在可视化函数中增加绘制每个信号源的时频谱(作为多个子图),但题目没有要求,且原函数只绘制两个子图(瀑布图和二值图像),所以我们暂时不增加,以免过于复杂。最后,注意修改后的函数输出composite_signal是一个矩阵(n行),每一行是一个信号源的信号。代码修改:1.修改函数定义,增加参数n,并设置默认值。2.在参数验证后,添加对n的验证。3.划分频带。4.初始化composite_signal为n行。5.在循环中,计算中心频率,并分配到对应的频带索引。6.将像素信号加到对应的行上。7.分别归一化每一行。8.可视化时,叠加所有行得到总信号,然后传入visualize_spectrogram。注意:原函数中,在循环内生成像素信号的函数generate_tf_rectangle保持不变,因为它只生成一个时间段的信号,与频带划分无关。下面给出修改后的generate_tf_waterfall函数代码(只修改这个函数,其他辅助函数不变):</think>根据需求,我修改了 `generate_tf_waterfall` 函数,引入频域分段参数 `n`,将信号分为 `n` 个独立频段处理。以下是修改后的代码及详细解释: ### 修改后的 generate_tf_waterfall 函数 ```matlab function [composite_signals, t_total, Fs] = generate_tf_waterfall(grayImg, f1, f2, t1, t2, n) % 参数验证 if nargin < 6 n = 1; % 默认不分段 elseif n < 1 || fix(n) ~= n error('n 必须是正整数'); end if f1 >= f2 error('f1 必须小于 f2'); end if t1 >= t2 error('t1 必须小于 t2'); end if ~ismatrix(grayImg) || ~isnumeric(grayImg) error('grayImg 必须是二维数值数组'); end if any(grayImg(:) > 1 | grayImg(:) < 0) warning('二值图像应在[0,1]范围内,自动二值化处理'); grayImg = grayImg > 0.5; end % 自适应采样率 k = 2.5; Fs = max(1000, k * f2); if Fs <= 2*f2 Fs = 2.1 * f2; warning('调整Fs=%.1fHz以满足Nyquist要求', Fs); end % 获取图像尺寸 [M, N] = size(grayImg); total_duration = t2 - t1; delta_t = total_duration / max(N, 1); t_total = linspace(t1, t2, ceil(total_duration * Fs)); % === 关键修改1: 初始化多信号源存储 === composite_signals = zeros(n, numel(t_total)); % n行信号矩阵 % 预计算频率映射 freq_bins = linspace(f2, f1, M+1); % 顶部行=高频, 底部行=低频 f_bands = linspace(f1, f2, n+1); % 频域分段边界 % 处理每个时间列 for j = 1:N t_start_pixel = t1 + (j-1) * delta_t; t_end_pixel = t1 + j * delta_t; non_zero_rows = find(grayImg(:, j)); for k = 1:numel(non_zero_rows) row_idx = non_zero_rows(k); % 计算像素频率范围 if row_idx < M f_low = freq_bins(row_idx + 1); f_high = freq_bins(row_idx); else f_low = freq_bins(end-1); f_high = freq_bins(end); end % 频率边界保护 f_low = max(f1, min(f2, f_low)); f_high = max(f1, min(f2, f_high)); if f_low >= f_high f_high = f_low + 0.1*(f2-f1); end % === 关键修改2: 确定所属频段 === center_freq = (f_low + f_high)/2; band_idx = find(center_freq >= f_bands(1:end-1) & center_freq <= f_bands(2:end), 1); if isempty(band_idx) % 边界保护 band_idx = min(n, max(1, round((center_freq-f1)/(f2-f1)*n))); end % 生成像素信号 [pixel_signal, t_pixel] = generate_tf_rectangle(... t_start_pixel, t_end_pixel, f_low, f_high, Fs); if isempty(pixel_signal) continue; end % === 关键修改3: 存储到对应频段信号源 === idx_start = find(t_total >= t_pixel(1), 1); if isempty(idx_start), idx_start = 1; end idx_end = find(t_total <= t_pixel(end), 1, 'last'); if isempty(idx_end), idx_end = numel(t_total); end valid_idx = idx_start:min(idx_end, numel(t_total)); sig_len = length(pixel_signal); valid_len = length(valid_idx); if valid_len > 0 if sig_len > valid_len composite_signals(band_idx, valid_idx) = ... composite_signals(band_idx, valid_idx) + pixel_signal(1:valid_len); else composite_signals(band_idx, valid_idx(1:sig_len)) = ... composite_signals(band_idx, valid_idx(1:sig_len)) + pixel_signal; end end end % 进度显示 if mod(j, 10) == 0 fprintf('处理进度: %d/%d 列 (%.1f%%)\n', j, N, j/N*100); end end % === 关键修改4: 分频段归一化 === for i = 1:n if max(abs(composite_signals(i,:))) > 0 composite_signals(i,:) = composite_signals(i,:) / max(abs(composite_signals(i,:))); end end % 可视化合成信号 if nargout == 0 || ~all(composite_signals(:) == 0) total_signal = sum(composite_signals, 1); % 合成所有信号源 visualize_spectrogram(total_signal, Fs, grayImg, f1, f2, t1, t2); end end ``` ### 修改点详解: 1. **输入参数扩展**: - 新增参数 `n` 控制频域分段数 - 添加参数验证:`n` 必须是正整数(默认值=1) 2. **频域分段处理**: ```matlab f_bands = linspace(f1, f2, n+1); % 划分频段边界 ``` 将总频带 `[f1, f2]` 均分为 `n` 段,例如 `n=3` 时: - 频段1: `[f1, f1 + Δf]` - 频段2: `[f1 + Δf, f1 + 2Δf]` - 频段3: `[f1 + 2Δf, f2]` 3. **信号存储结构**: ```matlab composite_signals = zeros(n, numel(t_total)); % n行信号矩阵 ``` 将返回值改为 `n×T` 矩阵,每行对应一个独立信号源 4. **像素-频段映射**: ```matlab center_freq = (f_low + f_high)/2; % 计算像素中心频率 band_idx = find(center_freq >= f_bands(1:end-1) & ... center_freq <= f_bands(2:end), 1); % 确定所属频段 ``` 根据像素的中心频率将其分配到对应频段信号源 5. **信号叠加逻辑**: ```matlab composite_signals(band_idx, valid_idx) = ... composite_signals(band_idx, valid_idx) + pixel_signal; ``` 像素信号只叠加到所属频段的信号源行 6. **独立归一化**: ```matlab for i = 1:n composite_signals(i,:) = ... / max(abs(composite_signals(i,:))); end ``` 每个信号源独立归一化,避免频段间幅度干扰 7. **可视化合成信号**: ```matlab total_signal = sum(composite_signals, 1); % 合成所有信号源 visualize_spectrogram(total_signal, ...); % 绘制合成后的瀑布图 ``` 各信号源叠加后生成最终时频图 ### 使用示例: ```matlab % 生成测试图像 img = imresize(phantom(128), [50,100]); img = mat2gray(img > 0.5); % 分3个频段生成信号 [signals, t, Fs] = generate_tf_waterfall(img, 100, 5000, 0, 10, 3); % 各信号源独立可视化 figure; for i = 1:3 subplot(3,1,i); plot(t, signals(i,:)); title(sprintf('信号源 %d (频段: %d-%dHz)', i, ...)); end ``` ### 修改效果: - **物理意义**:模拟多个独立声源协同工作,每个声源负责特定频段 - **工程优势**: 1. 避免宽带信号相位干涉 2. 支持多通道硬件输出 3. 频段能量独立可控 - **算法改进**: - 频段边界保护机制 - 动态频段分配策略 - 并行化处理基础(每行信号独立) ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值