You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

audio.cc 10 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /**
  2. * Copyright 2021 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "minddata/dataset/include/dataset/audio.h"
  17. #include "minddata/dataset/audio/ir/kernels/allpass_biquad_ir.h"
  18. #include "minddata/dataset/audio/ir/kernels/amplitude_to_db_ir.h"
  19. #include "minddata/dataset/audio/ir/kernels/angle_ir.h"
  20. #include "minddata/dataset/audio/ir/kernels/band_biquad_ir.h"
  21. #include "minddata/dataset/audio/ir/kernels/bandpass_biquad_ir.h"
  22. #include "minddata/dataset/audio/ir/kernels/bandreject_biquad_ir.h"
  23. #include "minddata/dataset/audio/ir/kernels/bass_biquad_ir.h"
  24. #include "minddata/dataset/audio/ir/kernels/complex_norm_ir.h"
  25. #include "minddata/dataset/audio/ir/kernels/contrast_ir.h"
  26. #include "minddata/dataset/audio/ir/kernels/deemph_biquad_ir.h"
  27. #include "minddata/dataset/audio/ir/kernels/frequency_masking_ir.h"
  28. #include "minddata/dataset/audio/ir/kernels/highpass_biquad_ir.h"
  29. #include "minddata/dataset/audio/ir/kernels/lowpass_biquad_ir.h"
  30. #include "minddata/dataset/audio/ir/kernels/time_masking_ir.h"
  31. #include "minddata/dataset/audio/ir/kernels/time_stretch_ir.h"
  32. namespace mindspore {
  33. namespace dataset {
  34. namespace audio {
  35. // AllpassBiquad Transform Operation.
  36. struct AllpassBiquad::Data {
  37. Data(int32_t sample_rate, float central_freq, float Q)
  38. : sample_rate_(sample_rate), central_freq_(central_freq), Q_(Q) {}
  39. int32_t sample_rate_;
  40. float central_freq_;
  41. float Q_;
  42. };
  43. AllpassBiquad::AllpassBiquad(int32_t sample_rate, float central_freq, float Q)
  44. : data_(std::make_shared<Data>(sample_rate, central_freq, Q)) {}
  45. std::shared_ptr<TensorOperation> AllpassBiquad::Parse() {
  46. return std::make_shared<AllpassBiquadOperation>(data_->sample_rate_, data_->central_freq_, data_->Q_);
  47. }
  48. // AmplitudeToDB Transform Operation.
  49. struct AmplitudeToDB::Data {
  50. Data(ScaleType stype, float ref_value, float amin, float top_db)
  51. : stype_(stype), ref_value_(ref_value), amin_(amin), top_db_(top_db) {}
  52. ScaleType stype_;
  53. float ref_value_;
  54. float amin_;
  55. float top_db_;
  56. };
  57. AmplitudeToDB::AmplitudeToDB(ScaleType stype, float ref_value, float amin, float top_db)
  58. : data_(std::make_shared<Data>(stype, ref_value, amin, top_db)) {}
  59. std::shared_ptr<TensorOperation> AmplitudeToDB::Parse() {
  60. return std::make_shared<AmplitudeToDBOperation>(data_->stype_, data_->ref_value_, data_->amin_, data_->top_db_);
  61. }
  62. // Angle Transform Operation.
  63. Angle::Angle() {}
  64. std::shared_ptr<TensorOperation> Angle::Parse() { return std::make_shared<AngleOperation>(); }
  65. // BandBiquad Transform Operation.
  66. struct BandBiquad::Data {
  67. Data(int32_t sample_rate, float central_freq, float Q, bool noise)
  68. : sample_rate_(sample_rate), central_freq_(central_freq), Q_(Q), noise_(noise) {}
  69. int32_t sample_rate_;
  70. float central_freq_;
  71. float Q_;
  72. bool noise_;
  73. };
  74. BandBiquad::BandBiquad(int32_t sample_rate, float central_freq, float Q, bool noise)
  75. : data_(std::make_shared<Data>(sample_rate, central_freq, Q, noise)) {}
  76. std::shared_ptr<TensorOperation> BandBiquad::Parse() {
  77. return std::make_shared<BandBiquadOperation>(data_->sample_rate_, data_->central_freq_, data_->Q_, data_->noise_);
  78. }
  79. // BandpassBiquad Transform Operation.
  80. struct BandpassBiquad::Data {
  81. Data(int32_t sample_rate, float central_freq, float Q, bool const_skirt_gain)
  82. : sample_rate_(sample_rate), central_freq_(central_freq), Q_(Q), const_skirt_gain_(const_skirt_gain) {}
  83. int32_t sample_rate_;
  84. float central_freq_;
  85. float Q_;
  86. bool const_skirt_gain_;
  87. };
  88. BandpassBiquad::BandpassBiquad(int32_t sample_rate, float central_freq, float Q, bool const_skirt_gain)
  89. : data_(std::make_shared<Data>(sample_rate, central_freq, Q, const_skirt_gain)) {}
  90. std::shared_ptr<TensorOperation> BandpassBiquad::Parse() {
  91. return std::make_shared<BandpassBiquadOperation>(data_->sample_rate_, data_->central_freq_, data_->Q_,
  92. data_->const_skirt_gain_);
  93. }
  94. // BandrejectBiquad Transform Operation.
  95. struct BandrejectBiquad::Data {
  96. Data(int32_t sample_rate, float central_freq, float Q)
  97. : sample_rate_(sample_rate), central_freq_(central_freq), Q_(Q) {}
  98. int32_t sample_rate_;
  99. float central_freq_;
  100. float Q_;
  101. };
  102. BandrejectBiquad::BandrejectBiquad(int32_t sample_rate, float central_freq, float Q)
  103. : data_(std::make_shared<Data>(sample_rate, central_freq, Q)) {}
  104. std::shared_ptr<TensorOperation> BandrejectBiquad::Parse() {
  105. return std::make_shared<BandrejectBiquadOperation>(data_->sample_rate_, data_->central_freq_, data_->Q_);
  106. }
  107. // BassBiquad Transform Operation.
  108. struct BassBiquad::Data {
  109. Data(int32_t sample_rate, float gain, float central_freq, float Q)
  110. : sample_rate_(sample_rate), gain_(gain), central_freq_(central_freq), Q_(Q) {}
  111. int32_t sample_rate_;
  112. float gain_;
  113. float central_freq_;
  114. float Q_;
  115. };
  116. BassBiquad::BassBiquad(int32_t sample_rate, float gain, float central_freq, float Q)
  117. : data_(std::make_shared<Data>(sample_rate, gain, central_freq, Q)) {}
  118. std::shared_ptr<TensorOperation> BassBiquad::Parse() {
  119. return std::make_shared<BassBiquadOperation>(data_->sample_rate_, data_->gain_, data_->central_freq_, data_->Q_);
  120. }
  121. // ComplexNorm Transform Operation.
  122. struct ComplexNorm::Data {
  123. explicit Data(float power) : power_(power) {}
  124. float power_;
  125. };
  126. ComplexNorm::ComplexNorm(float power) : data_(std::make_shared<Data>(power)) {}
  127. std::shared_ptr<TensorOperation> ComplexNorm::Parse() { return std::make_shared<ComplexNormOperation>(data_->power_); }
  128. // Contrast Transform Operation.
  129. struct Contrast::Data {
  130. explicit Data(float enhancement_amount) : enhancement_amount_(enhancement_amount) {}
  131. float enhancement_amount_;
  132. };
  133. Contrast::Contrast(float enhancement_amount) : data_(std::make_shared<Data>(enhancement_amount)) {}
  134. std::shared_ptr<TensorOperation> Contrast::Parse() {
  135. return std::make_shared<ContrastOperation>(data_->enhancement_amount_);
  136. }
  137. // DeemphBiquad Transform Operation.
  138. struct DeemphBiquad::Data {
  139. explicit Data(int32_t sample_rate) : sample_rate_(sample_rate) {}
  140. int32_t sample_rate_;
  141. };
  142. DeemphBiquad::DeemphBiquad(int32_t sample_rate) : data_(std::make_shared<Data>(sample_rate)) {}
  143. std::shared_ptr<TensorOperation> DeemphBiquad::Parse() {
  144. return std::make_shared<DeemphBiquadOperation>(data_->sample_rate_);
  145. }
  146. // FrequencyMasking Transform Operation.
  147. struct FrequencyMasking::Data {
  148. Data(bool iid_masks, int32_t frequency_mask_param, int32_t mask_start, float mask_value)
  149. : iid_masks_(iid_masks),
  150. frequency_mask_param_(frequency_mask_param),
  151. mask_start_(mask_start),
  152. mask_value_(mask_value) {}
  153. int32_t frequency_mask_param_;
  154. int32_t mask_start_;
  155. bool iid_masks_;
  156. float mask_value_;
  157. };
  158. FrequencyMasking::FrequencyMasking(bool iid_masks, int32_t frequency_mask_param, int32_t mask_start, float mask_value)
  159. : data_(std::make_shared<Data>(iid_masks, frequency_mask_param, mask_start, mask_value)) {}
  160. std::shared_ptr<TensorOperation> FrequencyMasking::Parse() {
  161. return std::make_shared<FrequencyMaskingOperation>(data_->iid_masks_, data_->frequency_mask_param_,
  162. data_->mask_start_, data_->mask_value_);
  163. }
  164. // HighpassBiquad Transform Operation.
  165. struct HighpassBiquad::Data {
  166. Data(int32_t sample_rate, float cutoff_freq, float Q) : sample_rate_(sample_rate), cutoff_freq_(cutoff_freq), Q_(Q) {}
  167. int32_t sample_rate_;
  168. float cutoff_freq_;
  169. float Q_;
  170. };
  171. HighpassBiquad::HighpassBiquad(int32_t sample_rate, float cutoff_freq, float Q)
  172. : data_(std::make_shared<Data>(sample_rate, cutoff_freq, Q)) {}
  173. std::shared_ptr<TensorOperation> HighpassBiquad::Parse() {
  174. return std::make_shared<HighpassBiquadOperation>(data_->sample_rate_, data_->cutoff_freq_, data_->Q_);
  175. }
  176. // LowpassBiquad Transform Operation.
  177. struct LowpassBiquad::Data {
  178. Data(int32_t sample_rate, float cutoff_freq, float Q) : sample_rate_(sample_rate), cutoff_freq_(cutoff_freq), Q_(Q) {}
  179. int32_t sample_rate_;
  180. float cutoff_freq_;
  181. float Q_;
  182. };
  183. LowpassBiquad::LowpassBiquad(int32_t sample_rate, float cutoff_freq, float Q)
  184. : data_(std::make_shared<Data>(sample_rate, cutoff_freq, Q)) {}
  185. std::shared_ptr<TensorOperation> LowpassBiquad::Parse() {
  186. return std::make_shared<LowpassBiquadOperation>(data_->sample_rate_, data_->cutoff_freq_, data_->Q_);
  187. }
  188. // TimeMasking Transform Operation.
  189. struct TimeMasking::Data {
  190. Data(bool iid_masks, int32_t time_mask_param, int32_t mask_start, float mask_value)
  191. : iid_masks_(iid_masks), time_mask_param_(time_mask_param), mask_start_(mask_start), mask_value_(mask_value) {}
  192. int32_t time_mask_param_;
  193. int32_t mask_start_;
  194. bool iid_masks_;
  195. float mask_value_;
  196. };
  197. TimeMasking::TimeMasking(bool iid_masks, int32_t time_mask_param, int32_t mask_start, float mask_value)
  198. : data_(std::make_shared<Data>(iid_masks, time_mask_param, mask_start, mask_value)) {}
  199. std::shared_ptr<TensorOperation> TimeMasking::Parse() {
  200. return std::make_shared<TimeMaskingOperation>(data_->iid_masks_, data_->time_mask_param_, data_->mask_start_,
  201. data_->mask_value_);
  202. }
  203. // TimeStretch Transform Operation.
  204. struct TimeStretch::Data {
  205. explicit Data(float hop_length, int n_freq, float fixed_rate)
  206. : hop_length_(hop_length), n_freq_(n_freq), fixed_rate_(fixed_rate) {}
  207. float hop_length_;
  208. int n_freq_;
  209. float fixed_rate_;
  210. };
  211. TimeStretch::TimeStretch(float hop_length, int n_freq, float fixed_rate)
  212. : data_(std::make_shared<Data>(hop_length, n_freq, fixed_rate)) {}
  213. std::shared_ptr<TensorOperation> TimeStretch::Parse() {
  214. return std::make_shared<TimeStretchOperation>(data_->hop_length_, data_->n_freq_, data_->fixed_rate_);
  215. }
  216. } // namespace audio
  217. } // namespace dataset
  218. } // namespace mindspore