| 99 | |
| 100 | template <KernelType kernel_type> |
| 101 | TfLiteStatus Eval(TfLiteContext* context, TfLiteNode* node) { |
| 102 | auto* params = |
| 103 | reinterpret_cast<TfLiteAudioSpectrogramParams*>(node->user_data); |
| 104 | |
| 105 | const TfLiteTensor* input = GetInput(context, node, kInputTensor); |
| 106 | TfLiteTensor* output = GetOutput(context, node, kOutputTensor); |
| 107 | |
| 108 | TF_LITE_ENSURE(context, params->spectrogram->Initialize(params->window_size, |
| 109 | params->stride)); |
| 110 | |
| 111 | const float* input_data = GetTensorData<float>(input); |
| 112 | |
| 113 | const int64_t sample_count = input->dims->data[0]; |
| 114 | const int64_t channel_count = input->dims->data[1]; |
| 115 | |
| 116 | const int64_t output_width = params->spectrogram->output_frequency_channels(); |
| 117 | |
| 118 | float* output_flat = GetTensorData<float>(output); |
| 119 | |
| 120 | std::vector<float> input_for_channel(sample_count); |
| 121 | for (int64_t channel = 0; channel < channel_count; ++channel) { |
| 122 | float* output_slice = |
| 123 | output_flat + (channel * params->output_height * output_width); |
| 124 | for (int i = 0; i < sample_count; ++i) { |
| 125 | input_for_channel[i] = input_data[i * channel_count + channel]; |
| 126 | } |
| 127 | std::vector<std::vector<float>> spectrogram_output; |
| 128 | TF_LITE_ENSURE(context, |
| 129 | params->spectrogram->ComputeSquaredMagnitudeSpectrogram( |
| 130 | input_for_channel, &spectrogram_output)); |
| 131 | TF_LITE_ENSURE_EQ(context, spectrogram_output.size(), |
| 132 | params->output_height); |
| 133 | TF_LITE_ENSURE(context, spectrogram_output.empty() || |
| 134 | (spectrogram_output[0].size() == output_width)); |
| 135 | for (int row_index = 0; row_index < params->output_height; ++row_index) { |
| 136 | const std::vector<float>& spectrogram_row = spectrogram_output[row_index]; |
| 137 | TF_LITE_ENSURE_EQ(context, spectrogram_row.size(), output_width); |
| 138 | float* output_row = output_slice + (row_index * output_width); |
| 139 | if (params->magnitude_squared) { |
| 140 | for (int i = 0; i < output_width; ++i) { |
| 141 | output_row[i] = spectrogram_row[i]; |
| 142 | } |
| 143 | } else { |
| 144 | for (int i = 0; i < output_width; ++i) { |
| 145 | output_row[i] = sqrtf(spectrogram_row[i]); |
| 146 | } |
| 147 | } |
| 148 | } |
| 149 | } |
| 150 | return kTfLiteOk; |
| 151 | } |
| 152 | |
| 153 | } // namespace audio_spectrogram |
| 154 |
nothing calls this directly
no test coverage detected